首页 > 解决方案 > 如何在过滤多维数组时解决这个问题,数组获得更多元素?

问题描述

我有一个名为“ 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 ”),其中包含“ Places ”中的所有东西,除了那些也在“占用”中的东西。这是代码:

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]);
        }
    }
}

我所期望的是,unOccupied 变成了这样:

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 ]

所以,这是“ Places ”的副本,但没有“占用”的元素。

如果“占用”包含 1 个元素,则一切正常,“未占用”包含 24 个元素。但是如果“占用”包含例如 2 个元素,“未占用”确实有 48 个元素,并且“地方”拥有的所有内容都是双倍的,除了也在“占用”中的元素。

如果“占用”包含更多元素,“未占用”也包含更多元素。但为什么?以及如何解决?

提前致谢!

标签: javascriptarraysloopsmultidimensional-array

解决方案


您的循环不完整:

怎么了?

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在同一个地方迭代 n 次,将其插入 n 次。arr

因此,您需要定义何时必须添加一个地点,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]))

推荐阅读