从对象的多维数组中删除重复项

阿比迪迪吉

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

[[{'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函数,但它没有按我想要的方式工作,因为这些是二维数组。另一种蛮力方法包括逐个遍历所有数组,然后进行搜索以查看是否有任何其他数组包含该元素并删除该元素。重复这个过程直到最后一个子数组。

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

某些性能拒绝并链接了一个答案,说这个答案是重复的。它不是。这是一个二维对象数组,堆栈溢出的所有帖子都回答一维对象数组。我不想在数组中找到重复项。我正在尝试在数组中的所有数组中查找重复项。

谢谢!

标记

我处理这个问题的好方法是使用 a Set,只需将您的标签添加到集合中,就像您filter()在 a 中一样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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章