问题很简单。我有一个对象数组的数组。示例:
[[{'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 /下划线执行此操作?我尝试了很多选择,第一个选择涉及将iteratee传递给.uniq
函数,但是由于这些是2d数组,因此无法按我想要的方式工作。另一种蛮力方法包括一个遍历所有数组,然后进行搜索以查看其他数组是否包含该元素并删除该元素。重复此过程,直到最后1个子阵列。
我不喜欢暴力破解方法,所以想知道是否还有其他方法可以保留唯一元素。
CertainPerformance拒绝投票并链接了一个答案,称该答案是重复的。它不是。这是一个2D对象数组,堆栈上的所有帖子都会溢出一维对象数组。我不希望在数组中找到重复项。我正在尝试查找数组中所有数组的重复项。
谢谢!
答案 0 :(得分: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)
答案 1 :(得分:0)
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); } );
答案 2 :(得分:0)
let intervals = [
[1, 20],
[1, 20],
[1, 20]
]
intervals = [...new Set(intervals.map(e => JSON.stringify(e)))].map(e => JSON.parse(e)) // [[1,20]]