使用javascript forEach 拼接多维数组

Using javascript forEach and splice on multidimensional array

我正在尝试遍历一些如下所示的数据:

[0]['fields']['status']['name'] = 'In progress'
[1]['fields']['status']['name'] = 'In progress'
[2]['fields']['status']['name'] = 'In review'
[3]['fields']['status']['name'] = 'In progress'
[4]['fields']['status']['name'] = 'In review'

我正在使用以下 foreach 循环来拼接所有无用的索引,在本例中是所有索引。

issues.forEach(function (item, index) {
   if (issues[index]['fields']['status']['name'] !== "Done") {
       issues.splice(index, 1);
   }
});

如果我稍后遍历数组,我可以输出 'In progress' 和 'In review' 这很奇怪,因为它们应该被取消设置。我认为发生这种情况是因为我在使用数组时对其进行了操作。谁能解释一下出了什么问题以及如何避免这种情况。

只需从索引的末尾开始循环。

这可以防止不可见的索引并将索引保​​留在它所属的位置。

var index = issues.length;

while (index--) {
    if (issues[index].fields.status.name !== "Done") {
        issues.splice(index, 1);
    }
}

一个可能的解决方案是用 while 循环替换 forEach 方法,因为当您使用 splice 时,这将修改 issues 数组 inplace 而你 跳过 一些元素。

我在下面的例子中演示了这一点。

let arr = [1,2,3,4]
arr.forEach((item, index) => {
  arr.splice(index, 1);
});
console.log(arr);

解决方案

let i = 0;
while(i < issues.length){
   if (issues[i]['fields']['status']['name'] !== "Done") {
       issues.splice(i, 1);
   }
   else i++;
}