ES6中用JavaScript过滤掉数组中重复项的最优雅方法是什么

时间:2019-11-26 09:42:19

标签: javascript ecmascript-6 lodash

我已经看到了很多有关此主题的答案,但我并不完全满意。我最喜欢的片段是这个:

[ ["1", "2"], ["1", "2", "3"], ["1", "2"] ]
  .filter(
    (path: string[], i: number, array: string[][]) => _.findIndex(array, x => _.isEqual(x, path)) === i
  )

这有效,但是我觉得它太冗长了,不适合我的喜好。是否有更紧凑的方法来实现这一目标?即使这意味着使用lodash之类的东西。我觉得我在2019年(2020年左右)确实缺少一些明显的东西。

3 个答案:

答案 0 :(得分:1)

您可以进行一堆关闭操作,并使用Set和一个字符串值进行检查。

var array = [["1", "2"], ["1", "2", "3"], ["1", "2"]],
    unique = array.filter(
        (s => a => 
            (j => !s.has(j) && s.add(j))
            (JSON.stringify(a))
        )
        (new Set)    
    );

console.log(unique);

答案 1 :(得分:1)

使用lodash,您可以使用_.uniqWith()对数组进行重复数据删除,并使用_.isEqual()作为比较器:

const array = [["1", "2"], ["1", "2", "3"], ["1", "2"]]

const result = _.uniqWith(array, _.isEqual)

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

答案 2 :(得分:-1)

实际上有很多方法,请尝试在浏览器控制台中播放。我通常对原语使用最直接的方法:

const uniques = [...new Set(originalArray)]

对于较难的物体:

const uniques = original.reduce((result, object) => {
  if (!result.find((o) => i._id === object._id)) {
    result.push(object);
  }
  return result;
}, [])