我有一个名为“ Places ”的多维数组,如下所示:
0: Array [ 1, 1 ]
1: Array [ 1, 2 ]
2: Array [ 1, 3 ]
3: Array [ 1, 4 ]
4: Array [ 1, 5 ]
5: Array [ 2, 1 ]
6: Array [ 2, 2 ]
7: Array [ 2, 3 ]
8: Array [ 2, 4 ]
9: Array [ 2, 5 ]
10: Array [ 3, 1 ]
11: Array [ 3, 2 ]
12: Array [ 3, 3 ]
13: Array [ 3, 4 ]
and so on until [ 5, 5 ]
我还有另一个数组(称为“ 已占用”):
0: Array [ 1, 5 ]
我有一个for-in循环,它使用“ 地方”中的所有内容创建一个新数组(“ unOccupied ”), “ 已占用”。 这是代码:
for(var arr in Places){
for(var filtered in occupied){
if(Places[arr][0] !== occupied[filtered][0] || Places[arr][1] !== occupied[filtered][1]){
unOccupied.push(Places[arr]);
}
}
}
我期望的是,“无人居住”变成了这样的东西:
0: Array [ 1, 1 ]
1: Array [ 1, 2 ]
2: Array [ 1, 3 ]
3: Array [ 1, 4 ]
4: Array [ 2, 1 ]
5: Array [ 2, 2 ]
and so on until [ 5, 5 ]
因此,这是“ 地方”的副本,但没有“ 已占用”的元素。
如果“ 已占用”包含1个元素,则一切正常,而“ unOccupied ”包含24个元素。但是,如果“ 已占用”包含例如2个元素,则“ unOccupied ”确实具有48个元素,而“ Places ”具有的所有内容都是两倍,但也位于“ 已占用”中的元素。
如果“ 已占用”包含更多元素,则“ unOccupied ”也包含更多元素。但为什么?以及如何解决?
谢谢!
答案 0 :(得分:0)
问题出在这一行:
for(var filtered in occupied)
如果3
中有occupied
个元素,则72
数组中将有unOccupied
个元素。原因:
说你有
places = [1, 2]
occupied = [1, 1], [1, 4], [1, 3]
现在,此循环将运行3
次:
for(var filtered in occupied){
if(Places[arr][0] !== occupied[filtered][0] || Places[arr][1] !== occupied[filtered][1]){
unOccupied.push(Places[arr]);
}
,并且每次将相同的元素保存在unOccupied
数组中时。因此,unOccupied
数组将变为:
unOccupied = [1, 2], [1, 2], [1, 2]
您可以执行以下操作:
var count = 0;
for(var arr in Places){
for(var filtered in occupied){
if(Places[arr][0] !== occupied[filtered][0] || Places[arr][1] !== occupied[filtered][1]){
count++;
}
if(count === occupied.length)
unOccupied.push(Places[arr]);
}
}
答案 1 :(得分:0)
您的循环不完整:
发生了什么事?
for(var arr in Places){
for(var filtered in occupied){
if(Places[arr][0] !== occupied[filtered][0] || Places[arr][1] !== occupied[filtered][1]){
unOccupied.push(Places[arr]);
}
}
}
由于它仅在当前位置occupied
上进行一次迭代,因此它仅适用于arr
中的一个元素。如果您在occupied
中有更多项目,则在相同的位置arr
上进行n次迭代,如果条件有效,则将其插入n次。
因此,您需要定义必须将地点添加到unoccupied
的时间,这是地点不在occupied
中的时间。
for(var arr in Places){
let isOccupied = false;
for(var filtered in occupied){
if(Places[arr][0] === occupied[filtered][0] || Places[arr][1] === occupied[filtered][1]){
isOccupied = true;
break;
}
}
!isOccupied && unOccupied.push(Places[arr]);
}
您还可以通过以下方式对此进行改进:
const unoccupied = Places.filter(place => occupied.every(occ => occ[0] !== place[0] || occ[1] !== place[1]))