使用JS在具有匹配键值对的类似对象数组中组合一个值数组



我有以下对象:

a = [
{id: 1, comp: 'ans', stat: 'www', value: ['1', '2']},
{id: 2, comp: 'qsn', stat: 'xxx', value: ['a', 'b']},
{id: 3, comp: 'ans', stat: 'yyy', value: ['3', '4']},
{id: 4, comp: 'qsn', stat: 'zzz' ,value: ['c', 'd']}
]

我想要最好的方法来组合键comp匹配的对象内部的值数组,而其他不匹配的属性则保持第一个元素的属性不变,只连接values数组。在上述场景中,我想要实现的输出是:

[
{id: 1, comp: 'ans', stat: 'www', value: ['1', '2', '3', '4']},
{id: 2, comp: 'qsn', stat: 'xxx', value: ['a', 'b', 'c', 'd']}
]

您可以使用函数Array.prototype.reduce和函数Object.valuescomp对对象进行分组,以提取分组的对象。

const a = [{id: 1, comp: 'ans', stat: 'www', value: ['1', '2']},{id: 2, comp: 'qsn', stat: 'xxx', value: ['a', 'b']},{id: 3, comp: 'ans', stat: 'yyy', value: ['3', '4']},{id: 4, comp: 'qsn', stat: 'zzz' ,value: ['c', 'd']}],
result = Object.values(a.reduce((a, {comp, value, ...rest}) => {
(a[comp] || (a[comp] = {...rest, comp, value: []})).value.push(...value);
return a;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

我认为需要一种更可读的方法

const a = [{
id: 1,
comp: 'ans',
stat: 'www',
value: ['1', '2']
},
{
id: 2,
comp: 'qsn',
stat: 'xxx',
value: ['a', 'b']
},
{
id: 3,
comp: 'ans',
stat: 'yyy',
value: ['3', '4']
},
{
id: 4,
comp: 'qsn',
stat: 'zzz',
value: ['c', 'd']
}
]
const result = [];
for (let aChild of a) {
const sameComp = result.find(res => res.comp === aChild.comp);
if (sameComp) {
sameComp.value = sameComp.value.concat(aChild.value);
} else {
result.push(aChild);
}
}
console.log(result);

最新更新