gpt4 book ai didi

javascript - 合并具有相同属性的数组对象

转载 作者:行者123 更新时间:2023-11-28 17:38:16 24 4
gpt4 key购买 nike

我正在做我的一个前端项目,我遇到了一种情况,我必须根据某些条件合并/添加数组中存在的对象。条件是

  • 仅应合并具有相同标签的对象。
  • 对于具有相同标签的对象,如果对象“a”也具有 b 对象中存在的属性,则必须添加该值,否则只需复制该属性即可。

所以我的输入是

[
{
label: 'label-1',
published: 1,
draft: 2,
id: 'some1'
},
{
label: 'label-1',
published: 2,
status: 0,
draft: 1,
id: 'some4'
},
{
label: 'label-2',
published: 1,
draft: 14,
id: 'some2'
},
{
label: 'label-2',
published: 12,
status: 0,
draft: 14,
id: 'some3'
}
]

和期望

    [
{
label: 'label-1',
published: 3,
draft: 4,
status: 0
},
{
label: 'label-2',
published: 13,
draft: 28,
status: 0
}
]

目前我正在使用以下代码来实现相同的目的,但发现它不整洁。有什么方法可以轻松实现这一点。

function mapData(data) {
let groupData = _.groupBy(data, 'label');
let stackBarData = [];
Object.keys(groupData).forEach((key) => {
if (groupData[key] && groupData[key].length > 0) {
let temp = Array.from(groupData[key]).reduce((a, b) => {
for (let property in b) {
if (b.hasOwnProperty(property)) {
if (property !== 'label' && property !== 'id' && property !== 'Others') {
a[property] = (a[property] || 0) + b[property];
} else {
a[property] = b[property];
}
}
}
return a;
}, {});
stackBarData.push(temp);
}
});
return stackBarData;
}

请帮忙。

最佳答案

这是一个纯 ES6 函数,它根据唯一标签收集数字对象值,将它们相加(这就是您似乎所做的):

function mapData(data) {
const grouped = new Map(data.map( ({label}) => [label, { label }] ));
for (let obj of data) {
let target = grouped.get(obj.label);
for (let [key, val] of Object.entries(obj)) {
if (typeof val === 'number') {
target[key] = (target[key] || 0) + val;
}
}
}
return [...grouped.values()];
}

// Sample data
const data = [{label: 'label-1',published: 1,draft: 2,id: 'some1'},{label: 'label-1',published: 2,status: 0,draft: 1,id: 'some4'},{label: 'label-2',published: 1,draft: 14,id: 'some2'},{label: 'label-2',published: 12,status: 0,draft: 14,id: 'some3'}];

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

如果您有想要排除的数字属性,那么最好有一组您感兴趣的显式属性:

const props = new Set(['status', 'published', 'draft']);
// ... etc
//
if (props.has(key)) {
target[key] = (target[key] || 0) + val;
}
// ...

关于javascript - 合并具有相同属性的数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48585817/

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