如何解决此问题,在过滤多维数组时,该数组会获得更多元素?

时间:2019-04-22 13:52:57

标签: javascript arrays loops multidimensional-array

我有一个名为“ 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 ”也包含更多元素。但为什么?以及如何解决?

谢谢!

2 个答案:

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