[JS] 应用splice删除多元素时出现的坑
先看一个片段:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.splice(2,2); # Banana,Orange
上面两行代码完全没有问题,能达到我们想要的效果。
假如变成了下面这种情况:
var origin=["aa","bb","cc","dd"]; var has = ["bb", "cc"]; var _index = []; for (i in origin) { # 这里或者使用for..in,不是重点 if ($.inArray(origin[i], has) != -1) { _index.push(i); } } # 重点来了 for (j in _index) { origin.splice(_index[j], 1); } console.log(origin); # 现在会输出我们想要的结果 ["aa", "dd"] 吗?
运行一下,我们看到了不是我们想要的结果,原因是执行一次splice,原数组就被更改过了,索引数组的索引重新排列整齐,这样我们记录的老的排列索引就对不上了。
原来是这样。
那么我们现在需要修改一下重点splice部分的代码:
var k = 0; for (j in _index) { origin.splice(_index[j] - k, 1); k++; }
原理是我们缩减索引值,来达到和要删除元素的索引对上的目的。
Tool:ChatAI
Refer:JS_splice的坑