Javascript数组拼接无法正常工作

Javascript Array Splice Not working fine

本文关键字:工作 常工作 数组 拼接 Javascript      更新时间:2023-09-26
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 控制台中复制并粘贴代码进行测试。

它不起作用,因为您在循环访问键时正在从数组中删除项目。当您删除一个项目时,它将根据数组在内部的实现方式重新排列其他项目,并且您最终会得到一个不迭代您期望的键的循环。

当我在 Firefox 中尝试时,它只迭代键 012r 键。在迭代时删除项目会使其跳过34splice本身工作正常,但它会影响循环,因此某些项根本不在迭代中。

由于您实际上是通过跳过非数字键来查找数组中的索引,因此您可以只遍历索引。通过向后循环遍历它们,您不会在循环遍历数组时遇到数组更改的问题:

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);

演示:http://jsfiddle.net/CguTp/1/

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");

由于缓存对象不是数组,因此不能期望拼接的行为与数组的行为相同。

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--;
            }
        }

拼接期望第一个索引为数字,

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中向前移动指针,而不是关联数组。因此,从拼接(n,x(中删除x将使功能类似于splice(key(等,因此它可以正常工作。