如何从嵌套数组中删除重复的数组?

3

我希望能够从一个二维数组中去除重复的数组。

例如,我有以下这个二维数组:

[[-1,0,1],[-1,-1,2],[-1,0,1]]

我想要删除重复项,只保留以下内容:

[[-1,0,1],[-1,-1,2]]

我尝试过:
arr.filter((v, i, a) => a.indexOf(v) == i)

但这只适用于原始数据类型,而不适用于数组等对象。

1
你是在寻找第二维度可变数组长度的通用方法,还是它们的长度总是相同的? - Gary
2个回答

2
你可以使用 Set 方法。Set对象可以存储任何类型的唯一值,并自动删除重复项。
首先将所有子数组转换为可比较的字符串。然后将它们添加到Set中以删除重复项。然后使用 Array.from()将字符串的Set转换为数组。最后解析JSON对象。
let arr = [[-1,0,1],[-1,-1,2],[-1,0,1]];
let uniqueArr = Array.from(new Set(arr.map(JSON.stringify))).map(JSON.parse);
console.log(uniqueArr); // output: [[-1,0,1],[-1,-1,2]]

0

这应该可以去除重复项并保留原始顺序;也就是说,它将原地删除重复项。当然,我没有测试每种可能的情况,可能有更聪明的方法来完成相同的任务。

let aOrig = [[-1,0,1],[-1,0,1],[-1,-1,2],[-1,-1,2],[-1,0,1],[2],[-1,0,1,1],[-1,0],[2]],
    a = new Array(),
    c = new Array()
    order = new Array();
aOrig.forEach( (v,i) => a.push([v.toString(),i]) );
a.sort((a,b) => a[0] < b[0] );
//a.forEach ( v => console.log(v[0].toString() + " : " + v[1]));
order.push(a[0][1]);
for (i=1, l=a.length; i < l; i++) {
  if ( a[i][0] != a[i-1][0] ) {
    order.push(a[i][1]);
  }
}
//console.log(order.toString());
order.sort().forEach( v => c.push( aOrig[v] ) );
console.log('---------');
c.forEach( v => console.log(v.toString()) );


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接