我想从二维数组中删除相同的部分

  • 本文关键字:删除 二维数组 javascript
  • 更新时间 :
  • 英文 :


我想比较一下下面脚本的两个安排,删除重复的安排。
我使用了Filter和Includes函数或for语句,但失败了。
我该怎么办?

let ground = [
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,3,3,7,7,7,7,8,8,4,4,4,2,2,3,7,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
]
let deleteBlock = [[1,3,3,7,7,7,7,8,8,4,4,4,2,2,3,7,1]]

I tried in this way

let ans = ground.filter((r,idx) => {
for(let i =0; i < deleteBlock.length;i++) {
if(r === deleteBlock[i]) {
ground.splice(idx, 1)
}
}
})
ground.filter((r) => deleteBlock.forEach(ele=> r.includes(ele)))

您可以创建一个arrayEqual函数来比较两个数组

function arrayEqual(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
for (let i = 0; i < arr1.length; i++)
if (arr1[i] !== arr2[i]) return false;  //adapt equality test if you have complex objects
return true;
}

,然后像下面这样使用

let ground = [...];
let filtered = ground.filter(x => deleteBlock.every(y => !arrayEqual(x,y)));

如果你比较两个具有相同属性的数组,你将总是得到false。例如,[1]===[1]总是返回false,因为它们都是具有相同内容的全新数组对象。

你应该循环遍历两个数组并逐个比较它们的属性或者在你的情况下因为我假设类型不是必须的你可以解构它们然后像这样比较字符串

const filtered = ground.filter((row) => { return row.join() !== deleteBlock.join(); });

最新更新