ES6对象数组根据某个属性去重最优雅的实现方式是什么?

符合题意的解决办法

function unique(arr) {
    const res = new Map();
    return arr.filter((a) => !res.has(a) && res.set(a, 1))
}

因为map key唯一,所以你想要根据哪个属性去重,res.has(a)里a就可以改成什么,比如a.name

参考:

https://segmentfault.com/a/11...

箭头函数

return arr.filter((a) => !res.has(a) && res.set(a, 1))
//上面的代码可以改成这样
return arr.filter(function(a){
    return !res.has(a) && res.set(a, 1);
});

1、箭头函数写代码拥有更加简洁的语法;
2、不会绑定this。


分割线,下面是我的个人问题,跟问题有些出入,采纳了我符合我个人问题的答案,抱歉

我是这么写的,
参考了
https://segmentfault.com/q/10...

https://blog.csdn.net/zhihua_...

问题和文章,但觉得不是很优雅,好像没有用什么es6的新东西,请问es6有更好地实现方式吗?谢谢各位

getGameVersionList() {
    const versionList = this.page.resultList
    const versionSet = [0]
    const hash = {}
    for (var i = 0, gameVersion; (gameVersion = versionList[i]) != null; i++) {
      if (!hash[gameVersion.gameVersionNo]) {
        versionSet.push(gameVersion.gameVersionNo)
        hash[gameVersion.gameVersionNo] = true
      }
    }
    this.gameVersionNoSet = versionSet
  },
阅读 15.8k
3 个回答
getGameVersionList() {
    return [0, ...new Set(this.page.resultList.map(item => item.gameVersionNo))]
}

用filter吧,符合条件的可以直接return,在配合存hash。

hash直接把值作为key是有坑的,比如[1, '1', [1]],这三个当作key就一模一样都是'1'
用map也不行:

let map = new Map();
map.set([1], 'test');
map.get([1]) //undefined

前后的[1]不是同一个一样取不到,还是object模拟hash配合类型判断吧。


刚想了下,两个[1]本来就不重复,看需求吧,还是可以用map做hash的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏