使用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++;
}
我正在尝试遍历一些如下所示的数据:
[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++;
}