首页 > 解决方案 > 根据对象数组中的值属性查找重复对象,然后在其标签属性中减少连接重复对象的数组

问题描述

假设我有一个这样的对象数组:

[ 
    {value: "2021", label: "REDS"},
    {value: "2020", label: "REDS"},
    {value: "2021", label: "COPASA"},
    {value: "2021", label: "CEMIG_CLIENTES"},
    {value: "2016", label: "CEMIG_CLIENTES"},
    {value: "2016", label: "RFQSA"}
]

我需要的是根据 value 属性找到重复的条目并输出一个连接其 label 属性的新数组。所以结果会是这样的:

[ 
    {value: "2021", label: "REDS/COPASA/CEMIG_CLIENTES"},
    {value: "2020", label: "REDS"},
    {value: "2016", label: "CEMIG_CLIENTES/RFQSA"}
]

我怎样才能做到这一点?我被困住了。我尝试获得独特的价值并通过以下方式实现它:

 const unique =  arr.map(e => e['value'])
             .map((e, i, final) => final.indexOf(e) === i && i)
             .filter(obj=> aux2[obj])
             .map(e => aux2[e]);

但是这还不够,因为标签不会丢失,我还考虑过对数组进行排序并运行一个函数来获取重复项的位置,然后通过将它们合并在一起来弹出下一个出现的位置。但我还没有能够实现它。有没有更好的办法?如果没有,任何人都可以阐明如何做到这一点?

提前致谢!

标签: javascriptarraysobject

解决方案


let combineSimilar = (arr) => {

    let map = {};
    arr.forEach(x => {

        if (!map[x.value]) map[x.value] = {
            value: x.value,
            label: x.label
        }
        else map[x.value].label += "/" + x.label

    })

    return Object.values(map)

}

console.log(combineSimilar([ 
    {value: "2021", label: "REDS"},
    {value: "2020", label: "REDS"},
    {value: "2021", label: "COPASA"},
    {value: "2021", label: "CEMIG_CLIENTES"},
    {value: "2016", label: "CEMIG_CLIENTES"},
    {value: "2016", label: "RFQSA"}
]))


推荐阅读