问题很简单。我有一组对象数组。例子:
[[{'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] 删除。
我来说两句