Обработать этот массив объектов и объединить некоторые в один
У меня есть этот объект.
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" } }
];
Я хочу уменьшить количество объектов, объединив несколько связанных объектов в один.
Результирующий массив должен выглядеть так:
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" } }
];
В orig_array
есть 3 объекта с "MSG_ID"
. Последующие объекты "STATE_X"
объединяются в объект "MSG_ID"
. Я уже некоторое время смотрю на эту проблему. Кто-нибудь может помочь или дать некоторые подсказки в качестве начального запуска?
Вы можете использовать Array#reduce
и искать 'MSG_ID'
как групповое изменение.
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);
Вы можете сделать со многими js-функциями eg.sort, map, forEach... и т.д. Я попробовал с моей предпочитаемой функцией .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);
Я думаю, что это будет правильный ответ
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)
Думаю, вам нужен метод groupBy:
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);
- Вопросы
- Javascript
- Обработать этот массив объектов и объединить некоторые в один