JS数组对象

原始数据:
let arr = [
    {
        name:'lsy',
        map:['1','2','3','4']
    },
     {
        name:'lsy',
        map:['1','2','3','4','5']
    },
    {
        name:'lsy',
        map:['1']
    },
    {
        name:'fan',
        map:['1','2','3','4']
    },
     {
        name:'fan',
        map:['1','2']
    },
    {
        name:'fan',
        map:['1']
    }
]
目标数据:
arr1 = [
    {
        name:'lsy',
        map:['1','2','3','4','5']
    },
    {
        name:'fan',
        map:['1','2','3','4']
    },
]

如上,希望最后只保留name唯一、map.length最大的那个对象,该怎么实现

阅读 1.8k
3 个回答
const res = []
for(const item of arr) {
    const index = res.findIndex(i => i.name === item.name)
    if(index > -1) {
        res[index] = {
            name: item.name,
            map: Array.from(new Set([...res[index].map,...item.map]))
        }
    } else {
        res.push(item)
    }
}

最后的res即是你要的结果

Array
    .from(arr)
    .sort((m, n) => m.name === n.name && m.map.length - n.map.length)
    .filter(({ name: m }, index, { [index + 1]: { name: n } = {} }) => m != n);
Object.values([
    {
        name:'lsy',
        map:['1','2','3','4']
    },
     {
        name:'lsy',
        map:['1','2','3','4','5']
    },
    {
        name:'lsy',
        map:['1']
    },
    {
        name:'fan',
        map:['1','2','3','4']
    },
     {
        name:'fan',
        map:['1','2']
    },
    {
        name:'fan',
        map:['1']
    }
].reduce((res,{name,map}) => {
    if(name in res){
        if(res[name].map.length < map.length) res[name].map = map
    } else res[name] = {name, map}
    return res;
}, {}))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题