gpt4 book ai didi

javascript - 通过 id 组合对象数组并减少其嵌套对象

转载 作者:行者123 更新时间:2023-11-30 19:44:23 25 4
gpt4 key购买 nike

我有一个对象数组 (old_array) 需要合并成为 (new_array)

old_array = [
{ id: 'ffff55', name: 'f5', card: 'a', request: { device: 0, bus: 1, ship: 21 } },
{ id: 'vvvv44', name: 'v4', card: 'c', request: { device: 3, bus: 10, ship: 2 } },
{ id: 'cccc33', name: 'c3', card: 'a', request: { device: 0, bus: 1, ship: 2 } },
{ id: 'ffff55', name: 'f5', card: 'b', request: { device: 32, bus: 31, ship: 32 } },
{ id: 'cccc33', name: 'c3', card: 'e', request: { device: 21, bus: 21, ship: 22 } },
{ id: 'cccc33', name: 'c3', card: 'd', request: { device: 4, bus: 1, ship: 2 } },
{ id: 'vvvv44', name: 'v4', card: 'c', request: { device: 13, bus: 11, ship: 12 } }
];

new_array = [
{ id: 'ffff55', name: 'f5', unique_cards: 2, request: { device: 32, bus: 32, ship: 53 } },
{ id: 'vvvv44', name: 'v4', unique_cards: 1, request: { device: 16, bus: 21, ship: 14 } },
{ id: 'cccc33', name: 'c3', unique_cards: 3, request: { device: 25, bus: 23, ship: 26 } }
];
  • 将具有相同id和name的对象合并为一个对象
  • 合并嵌套的请求对象(其值的总和)
  • 将卡片映射到唯一卡片的数量(按 ID)

我已经连续尝试了 4 天,但是这个数组操作很难

我最好的尝试是尝试按 id 对对象数组进行分组,但由于有许多冗余值,它变得更加复杂

groupByArray(xs, key) {
return xs.reduce(function(rv, x) {
let v = key instanceof Function ? key(x) : x[key];
let el = rv.find((r) => r && r.key === v);
if (el) {
el.values.push(x);
} else {
rv.push({ key: v, values: [ x ] });
}
return rv;
}, []);
}

groupByArray(old_array , 'id')

最佳答案

您可以使用函数reduce 进行分组,并使用函数Object.values 提取分组后的对象。

在 reduce 的处理程序内部,您需要遍历请求的键以求和每个值。

let array = [        { id: 'ffff55', name: 'f5', card: 'a', request: { device: 0, bus: 1, ship: 21 } },        { id: 'vvvv44', name: 'v4', card: 'c', request: { device: 3, bus: 10, ship: 2 } },        { id: 'cccc33', name: 'c3', card: 'a', request: { device: 0, bus: 1, ship: 2 } },        { id: 'ffff55', name: 'f5', card: 'b', request: { device: 32, bus: 31, ship: 32 } },        { id: 'cccc33', name: 'c3', card: 'e', request: { device: 21, bus: 21, ship: 22 } },        { id: 'cccc33', name: 'c3', card: 'd', request: { device: 4, bus: 1, ship: 2 } },        { id: 'vvvv44', name: 'v4', card: 'c', request: { device: 13, bus: 11, ship: 12 } }    ];
let result = Object.values(array.reduce((a, {id, name, card, request}) => {
(a[id] || (a[id] = {id, card, name, unique_cards: 1, request: {}}));

if (a[id].card !== card) {
a[id].unique_cards++;
a[id].card = card;
}

Object.keys(request).forEach(k => a[id].request[k] = (a[id].request[k] || 0) + request[k]);
return a;
}, Object.create(null)));

result.forEach(o => delete o.card);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 通过 id 组合对象数组并减少其嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55072673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com