【问题标题】:Removing duplicates from Multidimensional array of objects从多维对象数组中删除重复项
【发布时间】:2018-08-16 02:58:24
【问题描述】:

问题很简单。我有一组对象数组。示例:

[[{'name':'cat"}, {'name':'lion'}], [{'name':'elephant"},
{'name':'lion'}, {'name':'dog'}], [{'name':'tiger"}, {'name':'mouse'},
{'name':'dog'}]]

我想使用 JS 删除重复项,只保留它们的第一次出现并删除它们的重复项,结果是:

[[{'name':'cat"}, {'name':'lion'}], [{'name':'elephant"},
{'name':'dog'}], [{'name':'tiger"}, {'name':'mouse'}]]

如何使用 loadash/下划线来做到这一点?我尝试了很多选项,第一个涉及将迭代对象传递给 .uniq 函数,但它没有按照我想要的方式工作,因为这些是二维数组。另一种蛮力方法包括一个接一个地遍历所有数组,然后进行搜索以查看是否有任何其他数组包含该元素并删除该元素。重复此过程,直到子数组的最后一个。

不喜欢蛮力方法,所以想知道是否有任何其他方法可以保留独特的元素。

请注意,这是一个二维对象数组,堆栈溢出的所有帖子都回答一维对象数组。我不想在数组中找到重复项。我正在尝试在数组中的所有数组中查找重复项。

【问题讨论】:

    标签: javascript arrays unique


    【解决方案1】:

    处理这个问题的好方法是使用Set,只需将标签添加到集合中,就像filter()map() 中一样:

    let arr = [
        [{'name':'cat'}, {'name':'lion'}], 
        [{'name':'elephant'},{'name':'lion'}, {'name':'dog'}],
        [{'name':'tiger'}, {'name':'mouse'}, {'name':'dog'}]
        ]
    
    let known = new Set()
    let filtered = arr.map(subarray => 
        subarray.filter(item => !known.has(item.name) && known.add(item.name))
    )
    console.log(filtered)

    编辑:如果不能使用 Set,则可以从常规对象中获取相同的功能:

    let arr = [
        [{'name':'cat'}, {'name':'lion'}], 
        [{'name':'elephant'},{'name':'lion'}, {'name':'dog'}],
        [{'name':'tiger'}, {'name':'mouse'}, {'name':'dog'}]
        ]
    
    let known = {}
    let filtered = arr.map(subarray => 
        subarray.filter(item => !known.hasOwnProperty(item.name) && (known[item.name] = true))
    )
    console.log(filtered)

    【讨论】:

    • 无法使用set,因为我使用的平台不带ES6,我仅限于使用ES5。我们如何在 ES5 中做到这一点?
    • 一个对象的工作原理与@abhididigi 相同,请参阅编辑。
    【解决方案2】:
    let intervals = [
        [1, 20],
        [1, 20],
        [1, 20]
    ]
    intervals = [...new Set(intervals.map(e => JSON.stringify(e)))].map(e => JSON.parse(e)) // [[1,20]]
    

    【讨论】:

    • 考虑在答案中添加更多解释,以帮助我们理解更多,而不是仅仅发布一段代码
    【解决方案3】:
    var a = [];
    a.push( [1,2,3], [4,5,6], [1,2,3], [4,5,6] );
    a.forEach( ( chunk, idx ) => { a[idx] = JSON.stringify(chunk); } );
    a = [ ...new Set(a) ];
    a.forEach( ( chunk, idx ) => { a[idx] = JSON.parse(chunk); } );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-30
      • 2018-07-26
      • 2014-05-26
      • 2012-12-14
      • 2021-02-16
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多