Обработать этот массив объектов и объединить некоторые в один

86
7

У меня есть этот объект.


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". Я уже некоторое время смотрю на эту проблему. Кто-нибудь может помочь или дать некоторые подсказки в качестве начального запуска?

спросил(а) 2021-01-19T16:44:53+03:00 2 месяца, 3 недели назад
1
Решение
114

Вы можете использовать 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);

ответил(а) 2021-01-19T16:44:53+03:00 2 месяца, 3 недели назад
75

Вы можете сделать со многими 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);

ответил(а) 2021-01-19T16:44:53+03:00 2 месяца, 3 недели назад
75

Я думаю, что это будет правильный ответ


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)

ответил(а) 2021-01-19T16:44:53+03:00 2 месяца, 3 недели назад
61

Думаю, вам нужен метод 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);

ответил(а) 2021-01-19T16:44:53+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема