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

时间:2018-08-16 02:58:24

标签: javascript arrays unique

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

[[{'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对象数组,堆栈上的所有帖子都会溢出一维对象数组。我不希望在数组中找到重复项。我正在尝试查找数组中所有数组的重复项。

谢谢!

3 个答案:

答案 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]]