【问题标题】:What's the most elegant way in ES6 to filter out duplicates in an array in Javascript [duplicate]ES6中过滤Javascript数组中重复项的最优雅方法是什么[重复]
【发布时间】:2019-11-26 09:42:19
【问题描述】:

我已经看到了很多关于这个话题的答案,但我并不完全满意。我最喜欢的sn-p是这个:

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

这行得通,但我觉得它太冗长了,我不喜欢。没有更紧凑的方法来实现这一点吗?即使这意味着使用 lodash 或其他东西。我觉得我在 2019 年(接近 2020 年)错过了一些非常明显的东西。

【问题讨论】:

  • 要求我们建议、查找或推荐书籍、工具、软件库、插件、教程、解释技术或提供任何其他场外资源的问题对于 Stack Overflow 来说是题外话
  • 根据接受的答案看起来这是一个非 RTFM 问题。
  • 我(和许多其他人一样)查看了 lodash 文档,但不知何故我们找不到 .uniqWith()。抱歉,我们没有你那么完美。

标签: javascript ecmascript-6 lodash


【解决方案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】:

    您可以使用一堆闭包并检查 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);

    【讨论】:

      【解决方案3】:

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

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

      对于较硬的物体:

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

      【讨论】:

        猜你喜欢
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多