关于删除数组中的某一项的问题?

var arr = ["Blockly.Blocks['应用于']","Blockly.JavaScript['应用于']","Blockly.JavaScript['是是是']","Blockly.Blocks['是是是']"];
for(var i=0;i<arr.length;i++){
    if (arr[i].indexOf('应用于') != -1) {
        arr.splice(i,1);
        console.log(i);
        console.log(arr[i]);
    }
}
console.log(arr);

打印出来是这样的:
图片描述

只匹配了一次,这是为什么啊?
谢谢!

阅读 3.2k
4 个回答
解决办法1:删除后再i--;   
var arr = ["Blockly.Blocks['应用于']", "Blockly.JavaScript['应用于']", "Blockly.JavaScript['是是是']", "Blockly.Blocks['是是是']"];
for (var i = 0; i < arr.length; i++) {
    if (arr[i].indexOf('应用于') != -1) {
        arr.splice(i--, 1);
    }
}
console.log(arr);

//倒序删除
var arr = ["Blockly.Blocks['应用于']", "Blockly.JavaScript['应用于']", "Blockly.JavaScript['是是是']", "Blockly.Blocks['是是是']"];

for (var i = arr.length - 1; i >= 0; i--) {
    if (arr[i].indexOf('应用于') != -1) {
        arr.splice(i, 1);
    }
}
console.log(arr);

你在循环里面修改了原数据arr了啊
第一次循环i=0 arr[0]="Blockly.Blocks['应用于']"可以匹配上
然后你把arr的0元素给删除了
第二次循环i=1 arr[1]="Blockly.JavaScript['是是是']" 了。

这个错误犯的有点。。

你的for循环,长度是动态改变的,也就是说删除了一个元素,长度就变了

i=0时,arr[0]="Blockly.Blocks['应用于']",arr[0].indexOf('应用于') != -1为true, arr.splice(i,1)删除了第0项,这时arr=["Blockly.JavaScript['应用于']","Blockly.JavaScript['是是是']","Blockly.Blocks['是是是']"]。arr.length变为3
i=1时,arr[1]="Blockly.JavaScript['是是是']", arr[1].indexOf('应用于') != -1为false
i=2时,同上

参考https://developer.mozilla.org...

推荐问题