数组去重,数组的值是对象。

const list = [
    {
        id:1,
        info: '西瓜'
    },
    {
        id:1,
        info: '西瓜'
    },
    {
        id:2,
        info: '草莓'
    },
    {
        id:3,
        info: '榴莲'
    },
    {
        id:3,
        info: '榴莲'
    },
    {
        id:4,
        info: '苹果'
    }
]

const hash = {};
const arr = list.reduce(function(item, next) {
      hash[next.id] ? '' : (hash[next.id] = true && item.push(next));
      return item;
}, []);

数组的值是对象,然后通过reduce方法去掉ID重复的值,问题就是我感觉还是有点繁琐,现在的问题是如果别人看的话还需要理解一下子,有没有更简洁明了的写法,或者什么工具类比如lodash什么的方法推荐,谢谢

阅读 2.5k
5 个回答
const arr = list.filter((item, index) => list.map(i => i.id).indexOf(item.id) === index)

reduce理解不了就不要写reduce,常规写法不就行了:

let arr = [];
const hash = {};
for (let i = 0; i < list.length; i++) {
    if !hash[list[i].id] {
        arr.push(list[i]);
        hash[list[i].id] = true;
    }
}

在你这个基础上使用filter就可以

const arr = list.filter((item, index) => hash[item.id] ? false : hash[item.id] = true)

既然你追求简洁并提到loadsh,那就用loadsh的方式来解决吧。

var list = [
    {
        id:1,
        info: '西瓜'
    },
    {
        id:1,
        info: '西瓜'
    },
    {
        id:2,
        info: '草莓'
    },
    {
        id:3,
        info: '榴莲'
    },
    {
        id:3,
        info: '榴莲'
    },
    {
        id:4,
        info: '苹果'
    }
]

// 使用 loadsh 的 isEqual 来做深比较
_.uniqWith(list, _.isEqual);

// 如果只是 id 相同,value 可能不同,只保留第一项的话,可以这样:
var list = [
    {
        id:1,
        info: '西瓜'
    },
    {
        id:1,
        info: '黄瓜'
    },
    {
        id:2,
        info: '草莓'
    },
    {
        id:3,
        info: '榴莲牛奶'
    },
    {
        id:3,
        info: '榴莲'
    },
    {
        id:4,
        info: '苹果'
    }
]
_.uniqWith(list, (p,n) => p.id === n.id);

lodash/uniqWith 中文文档 你可以在该站的控制台直接输入示例代码来验证效果

这个东西,不就是一个 filter的事情吗?

关键是filter里面的判断条件了

// 方法1: 理由 Array.prototype.includes
let ids = [];
list = list.filter((item)=>{
    let {id} = item;
    if(!ids.includes(id)){
      ids.push(id);
      return true;
    }
})

// list 就是过滤之后的数据

// 方法2: 利用对象的 key
let idObj = {};
list = list.filter((item)=>{
    let {id} = item;
    // 这里需要处理 id=0 的情况
    if(!idObj[id]){
        idObj[id]=id;
        return true;
    }
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题