Сгруппировать по схожим данным, но сохранить ключи и значения javascript

63
5

Во время работы у меня возникли проблемы с этой задачей, вот мои данные:

var order = [
{area: "RFCC",ru: "R401",tot: 3,unit: "OFFSITE"},
{area: "RFCC",ru: "R401",tot: 1,unit: "RCU"}];

Я хочу, чтобы результат был таким:

var order = [
{area:["RFCC","RFCC"],ru:["R401","R401"],tot:[4],unit:["OFFSITE","RCU"]}]

Кто-нибудь знает решение для этого? Заранее спасибо.

спросил(а) 2021-01-25T17:49:41+03:00 4 месяца, 4 недели назад
1
Решение
63

Вы можете использовать "for..of" для циклического перемещения по объектам массива.

var order = [
{area: "RFCC",ru: "R401",tot: 3,unit: "OFFSITE"},
{area: "RFCC",ru: "R401",tot: 1,unit: "RCU"}
];

var result = {}

for(let obj of order) {
for(let [key, value] of Object.entries(obj)) {

typeof value == "string" && (
result[key] = result[key] ? result[key].concat(value) : [value]
)

typeof value == "number" && (
result[key] = result[key] ? [result[key][0] + value] : [value]
)
}
}

console.log(result)

ответил(а) 2021-01-25T17:49:41+03:00 4 месяца, 4 недели назад
63

Для этого вы можете использовать Array#reduce(), выполнив следующее:

var order = [
{area: "RFCC",ru: "R401",tot: 3,unit: "OFFSITE"},
{area: "RFCC",ru: "R401",tot: 1,unit: "RCU"}
];

var result = order.reduce((result, item) => {

const { area, ru, tot, unit } = result[0]

area.push( item.area );
ru.push( item.ru );
unit.push( item.unit );
tot[0] = parseInt(tot[0]) + parseInt(item.tot);

return result

}, [{ area : [], ru : [], tot: [ 0 ], unit : [] }])

console.log(result);

ответил(а) 2021-01-25T17:49:41+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

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