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

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.1k
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...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题