Reputation: 1776
I need to obtain from a given array of objects another array of objects but a little bit processed. Example:
var arr = [
{
"level": "INF",
"model": "A"
},{
"level": "INF",
"model": "B"
},{
"level": "INF",
"model": "C"
},{
"level": "INC",
"model": "A"
},{
"level": "IND",
"model": "A"
},{
"level": "IND",
"model": "B"
}
]
process_array(arr)
should return:
[{
"level": "INF",
"model": "A-B-C"
},{
"level": "INC",
"model": "A"
},{
"level": "IND",
"model": "A-D"
}]
I mean, there only will be one object per different level and all the different models for that level will be concatenated by '-'.
What would be an easy way to achieve so?
My approach, for getting an array with different levels:
function process_array(array) {
var values_seen = {}; // for removing duplicates
for (var i = 0; i < array.length; i++) {
values_seen[array[i]["level"]] = true;
}
return Object.keys(values_seen);
}
Now i need to obtain the concatented models for each levels..
Upvotes: 4
Views: 1189
Reputation: 173522
Just reduce the array into an object:
return array.reduce(function(total, current) {
if (total[current.level]) { // existing
total[current.level].model += '-' + current.model;
} else { // new
total[current.level] = current;
}
return total;
}, {});
In each iteration you modify the total
object and then return it to be used within the next iteration. The final value of that object is returned to the caller.
See also Array.prototype.reduce()
Upvotes: 4
Reputation: 41533
function processArray(arr) {
var result = [];
arr
.map(function(v) {return v.level;})
.forEach(function(v, i) {
var resultValue = result.filter(function(el, j) {
return el.level === v;
})[0];
if(!resultValue) {
result.push(arr[i]);
} else {
resultValue.model += '-' + arr[i].model;
}
});
return result;
}
var arr = [
{
"level": "INF",
"model": "A"
},{
"level": "INF",
"model": "B"
},{
"level": "INF",
"model": "C"
},{
"level": "INC",
"model": "A"
},{
"level": "IND",
"model": "A"
},{
"level": "IND",
"model": "B"
}
];
alert(JSON.stringify(processArray(arr), null, 2));
Upvotes: 0
Reputation: 12163
What you are referring to is also called projection.
This code uses EcmaScript 5.
var arr = [
{
"level": "INF",
"model": "A"
},{
"level": "INF",
"model": "B"
},{
"level": "INF",
"model": "C"
},{
"level": "INC",
"model": "A"
},{
"level": "IND",
"model": "A"
},{
"level": "IND",
"model": "B"
}
];
function processArray(input) {
var buf = {}, result = [];
input.forEach(function(item) {
var model = item.model;
var existing = buf[item.level];
if (existing) {
existing.model += '-' + item.model;
} else {
existing = buf[item.level] = {
level: item.level,
model: model
};
result.push(existing);
}
});
return result;
}
var processed = processArray(arr);
console.log(processed);
Upvotes: 0
Reputation: 2532
var arr = [
{
"level": "INF",
"model": "A"
},{
"level": "INF",
"model": "B"
},{
"level": "INF",
"model": "C"
},{
"level": "INC",
"model": "A"
},{
"level": "IND",
"model": "A"
},{
"level": "IND",
"model": "B"
}
]
function processArray(array) {
var count = array.length, i, item, result = [], temp = {};
for (i = 0; i < count; i++) {
item = array[i];
if (temp[item.level] !== undefined) {
result[temp[item.level]].model += '-' + item.model;
} else {
temp[item.level] = result.length;
result.push(item);
}
}
return result;
}
alert(JSON.stringify(processArray(arr)));
Upvotes: 2