使用JS将具有匹配键值对的相似对象数组内的值数组组合

时间:2020-08-25 10:59:09

标签: javascript arrays json typescript

我有以下对象:

  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匹配的对象内部的值数组,而其他不匹配的属性则完整保留第一个元素的属性,并仅合并{{1 }}数组。在上述情况下,我要实现的输出是:

values

2 个答案:

答案 0 :(得分:2)

您可以使用功能comp和功能Array.prototype.reduce通过Object.values对对象进行分组,以提取分组的对象。

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; }

答案 1 :(得分:2)

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

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);