Reputation:
I have this object.
var orig_array = [
{ "MSG_ID": { "lgth": "1", "payload": 0 } },
{ "STATE_1": { "lgth": "1", "payload": "XX" } },
{ "STATE_2": { "lgth": "1", "payload": "XXX" } },
{ "MSG_ID": { "lgth": "1", "payload": 1 } },
{ "STATE_1": { "lgth": "1", "payload": "X" } },
{ "STATE_2": { "lgth": "1", "payload": "XX" } },
{ "STATE_3": { "lgth": "6", "payload": "XXX" } },
{ "MSG_ID": { "lgth": "1", "payload": 2 } },
{ "STATE_1": { "lgth": "1", "payload": "XXXX" } }
];
I want to reduce the number of objects by grouping a few related objects into a single one.
The resulting array should look like this;
var processed_array = [
{ "MSG_ID": { "lgth": "1", "payload": 0 }, "STATE_1": { "lgth": "1", "payload": "XX" },"STATE_2": { "lgth": "1", "payload": "XXX" } },
{ "MSG_ID": { "lgth": "1", "payload": 1 },"STATE_1": { "lgth": "1", "payload": "X" },"STATE_2": { "lgth": "1", "payload": "XX" },"STATE_3": { "lgth": "6", "payload": "XXX" } },
{ "MSG_ID": { "lgth": "1", "payload": 2 },"STATE_1": { "lgth": "1", "payload": "XXXX" } }
];
In orig_array
, there are 3 objects with "MSG_ID"
. The subsequent "STATE_X"
objects are combined into the above "MSG_ID"
object. I have been staring at this problem for some time. Anyone can help or give some hints as a head-start?
Upvotes: 3
Views: 138
Reputation: 4584
You can do with many js function eg.sort,map,forEach ...etc .I tried with my prefer function .sort
i = -1;
processed_array = [];
orig_array.sort(function (r) {
var k = Object.keys(r)[0];
if(k === "MSG_ID"){
i++;
processed_array.push({});
}
processed_array[i][k] = r[k];
return processed_array;
});
console.log(processed_array);
Upvotes: 2
Reputation: 3536
I think this would be the correct answer
var orig_json = [{
"MSG_ID": { "lgth": "1", "payload": 0 }
}, {
"STATE_1": { "lgth": "1", "payload": "XX" }
}, {
"STATE_2": { "lgth": "1", "payload": "XXX" }
}, {
"MSG_ID": { "lgth": "1", "payload": 1 }
}, {
"STATE_1": { "lgth": "1", "payload": "X" }
}, {
"STATE_2": { "lgth": "1", "payload": "XX" }
}, {
"STATE_3": { "lgth": "6", "payload": "XXX" }
}, {
"MSG_ID": { "lgth": "1", "payload": 2 }
}, {
"STATE_1": { "lgth": "1", "payload": "XXXX" }
}];
var out = [],
group = {};
orig_json
.reduce((p, c) => p.concat(
Object.keys(c).map(k => ({
key: k,
value: c[k]
}))
), []).forEach(v => {
if (v.key === "MSG_ID") {
group = {};
out.push(group);
}
group[v.key] = v.value
});
console.log(out)
Upvotes: 2
Reputation: 3536
I Think you need a groupBy method:
Array.prototype.groupBy = function(expresion) {
var collection = [];
this.forEach((v, i, a) => {
var key = expresion(v, i, a);
var group = collection.find(g => g.key === key);
if (!group) {
group = [];
group.key = key;
collection.push(group);
}
group.push(v);
});
return collection;
};
var orig_json = [{
"MSG_ID": { "lgth": "1", "payload": 0 }
}, {
"STATE_1": { "lgth": "1", "payload": "XX" }
}, {
"STATE_2": { "lgth": "1", "payload": "XXX" }
}, {
"MSG_ID": { "lgth": "1", "payload": 1 }
}, {
"STATE_1": { "lgth": "1", "payload": "X" }
}, {
"STATE_2": { "lgth": "1", "payload": "XX" }
}, {
"STATE_3": { "lgth": "6", "payload": "XXX" }
}, {
"MSG_ID": { "lgth": "1", "payload": 2 }
}, {
"STATE_1": { "lgth": "1", "payload": "XXXX" }
}];
var newObj =orig_json
.reduce((p, c) => p.concat(Object.keys(c).map(k => c[k])), [])
.groupBy(v => Object.keys(v)[0]);
console.log(newObj);
Upvotes: 1
Reputation: 386560
You could use Array#reduce
and look for 'MSG_ID'
as a group change.
var array = [{ "MSG_ID": { "lgth": "1", "payload": 0 } }, { "STATE_1": { "lgth": "1", "payload": "XX" } }, { "STATE_2": { "lgth": "1", "payload": "XXX" } }, { "MSG_ID": { "lgth": "1", "payload": 1 } }, { "STATE_1": { "lgth": "1", "payload": "X" } }, { "STATE_2": { "lgth": "1", "payload": "XX" } }, { "STATE_3": { "lgth": "6", "payload": "XXX" } }, { "MSG_ID": { "lgth": "1", "payload": 2 } }, { "STATE_1": { "lgth": "1", "payload": "XXXX" } }],
grouped = array.reduce(function (r, a) {
var key = Object.keys(a)[0];
if (key === 'MSG_ID') {
r.push({});
}
r[r.length - 1][key] = a[key];
return r;
}, []);
console.log(grouped);
Upvotes: 5