var cache = [];
cache[0] = "0";
cache[1] = "1";
cache[2] = "2";
cache[3] = "3";
cache[4] = "4";
cache["r"] = "r";
console.log(cache.length);
for(key in cache){
if(isNaN(key))continue;
else cache.splice(key,1); // cache.splice(key) is working fine, ***
}
console.log(cache);
问题:在行***
为什么拼接(键)工作正常(删除带有数字索引的所有元素)和拼接(键,1)不能正常工作(不删除带有数字索引的元素)。即便我尝试过
splice(key,1) // Not working as splice(key)
splice(key--,1) // Even not working as splice(key)
splice(key,0) // not deleting any thing
您可以在Firebug控制台中复制和粘贴代码进行测试。
答案 0 :(得分:8)
它无法正常工作,因为您正在从循环键中的数组中删除项目。当你删除一个项目时,它将重新排列其他项目,具体取决于数组在内部的实现方式,最终你得到一个不会迭代你期望的键的循环。
当我在Firefox中尝试时,它只会遍历键0
,1
,2
和r
。在迭代时删除项目会使其跳过3
和4
。 splice
本身工作正常,但它会影响循环,因此某些项目根本不在迭代中。
由于您实际上是通过跳过非数字键来查找数组中的索引,因此您可以直接遍历索引。通过向后循环它们,当你循环遍历数组时,你不会遇到问题:
var cache = ["0", "1", "2", "3", "4"];
cache.r = "r";
console.log(cache.length);
for (var i = cache.length - 1; i >= 0; i--) {
cache.splice(i, 1);
}
console.log(cache);
答案 1 :(得分:2)
1)cache["r"] = "r";
不向数组添加元素,它向缓存对象添加属性
要初始化数组,您可以使用
之类的东西var cache = ["0", "1", "2", "3", "4", "r"];
或
var cache = new Array();
cache.push("0");
cache.push("1");
cache.push("2");
cache.push("3");
cache.push("4");
cache.push("r");
由于您的缓存对象不是数组,因此您不能指望splice的行为与数组一样。
2)splice期望索引作为第一个参数,而不是键
请参阅http://www.w3schools.com/jsref/jsref_splice.asp
因此您可以使用它来删除所有数值:
for (var i = 0; i < cache.length; i++) {
if (!isNaN(cache[i])) {
cache.splice(i, 1); // cache.splice(key) is working fine, ***
i--;
}
}
答案 2 :(得分:1)
Splice希望第一个索引为数字,
splice(n,x); //n and x are numeric here
它将从索引n开始从数组中删除值,并在索引n后删除x值。
现在if n is not numeric but a key
则不需要x,因为x可以在numeric-indexed array
仅非关联数组中向前移动指针。因此从splice(n,x)中删除x将使函数类似于splice(key)等,因此它将正常工作。