例:有数组testArr= ["b", "b", "a", "b", "a"],需要把数组内的"b"删掉。
错误的写法:
<script>
var testArr = ["b", "b", "a", "b", "a"];
//替换掉数组里的b
for (var i = 0; i < testArr.length; i++) {
//如果是b,则从数组删掉
if (testArr[i] == "b")
testArr.splice(i, 1)
}
console.log(testArr);//testArr为 ["b","a","a"];
</script>
/*错误原因:在i=0时删掉了第一个"b", testArr变成了["b","a","b","a"];
继续走循环,i=1时 testArr length为4,testArr[1]已经不是最初的testArr[1]了
所以漏掉了第二个"b".*/
解决方法:
1. 使用i--,初始值为length-1,这样删除为数组最后开始删除(或通过验证),不影响继续执行的结果。
<script>
var testArr = ["b", "b", "a", "b", "a"];
//替换掉数组里的b
for (var i =0; i < testArr.length; i++) {
//如果是b,则从数组删掉
if (testArr[i] === "b"){
testArr.splice(i, 1)
//因为当前元素被删,后边的元素全部往前挪1个位置,i-1保证不漏掉数据
i-=1;
}
}
console.log(testArr);// testArr=["a","a"]
</script>
2.每次成功执行删除,则把当前的i减1。因为每删除一个元素,后边的依次靠前一个位置。所以把i-1可保证每个元素都不漏掉。
<script>
var testArr = ["b", "b", "a", "b", "a"];
//替换掉数组里的b
for (var i =0; i < testArr.length; i++) {
//如果是b,则从数组删掉
if (testArr[i] === "b"){
testArr.splice(i, 1)
//因为当前元素被删,后边的元素全部往前挪1个位置,i-1保证不漏掉数据
i-=1;
}
}
console.log(testArr);// testArr=["a","a"]
</script>
3. 使用一个新的数组存放筛选的值。
<script>
var testArr = ["b", "b", "a", "b", "a"];
var newArr = [];
for (var i = 0; i < testArr.length; i++) {
if (testArr[i] !== "b") {
newArr.push(testArr[i]);
}
}
console.log(newArr);//["a","a"]
</script>
该方法还可以Array.prototype.filter(ES5支持)实现
<script>
var testArr = ["b", "b", "a", "b", "a"];
var newArr = testArr.filter(function(item){
return item != "b";
});
console.log(newArr);//newArr=["a","a"]
</script>