【问题标题】:Javascript Array Splice Not working fineJavascript数组拼接不能正常工作
【发布时间】:2013-06-30 01:36:44
【问题描述】:
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);

问题:在*** 行中为什么 splice(key) 工作正常(删除具有数字索引的所有元素)而 splice(key,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 控制台中复制粘贴代码进行测试。

【问题讨论】:

  • 你能澄清“不工作”吗?当您尝试代码时会发生什么,它与您的预期有何不同?您收到任何错误消息吗?
  • 拼接函数从数组中删除元素。它应该删除所有具有数字索引的元素,但删除的元素很少
  • 所以 splice 希望我提供一个数字索引,所以 (n,x) 表示从数字索引 n 开始并在索引 n 之后删除 x 值。如果 n 不是数字而是键,则不需要 x。所以它工作正常 x 被删除。
  • 不,没有索引就不行。如果只指定一个参数,即用作索引,它将删除数组末尾的所有项目。如果您使用带有键而不是索引的方法并且它似乎有效,那只是巧合,因为您使用的特定值恰好给出了相同的结果。

标签: javascript jquery arrays splice for-in-loop


【解决方案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");

由于您的缓存对象不是数组,因此您不能期望 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--;
            }
        }

【讨论】:

  • 键或索引在我的情况下是相同的。我正在处理 javascript 的关联数组,而不是数字数组。请在谷歌搜索关联数组和 JSON 以了解更多信息:)
  • 根据这个问题的答案stackoverflow.com/questions/948894/… 然后你可以使用删除而不是拼接,这不能解释为什么 splice(key,1) 不起作用,但显然它是正确的方法从字符串索引数组中删除
  • 在研究了关联数组之后,我坚持我的答案。因为cache 不是一个数组,所以你不能期望 splice 表现得像它一样。
  • delete 是针对 JSON 对象而不是针对 JS 数组
  • 没错,delete 是针对 JSON 对象的,您的 cache 对象是 JSON 对象,而不是数组
【解决方案2】:

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

当我在 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/

【讨论】:

  • 反向删除是个好主意,但我使用的是关联数组。你应得的
  • 我的问题是为什么 splice(key,1) 不能在 splice(key) 工作得很好的同一个地方工作。
  • @Wasim:使用splice(key) 不起作用,在这种情况下它只会给出相同的结果,因为代码正在尝试删除所有项目。它将在第一次迭代中从数组中删除所有项目,它不会一次删除一个项目。
【解决方案3】:

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) 等,所以它会正常工作。

【讨论】:

  • 我也在寻找一种从关联数组中删除元素的好方法。根据这个答案,this 应该可以工作,但是,如控制台中所见,它对关联数组没有任何作用。使用delete 会起作用,就像在this example 中一样(尽管.length 属性似乎运行异常)。
  • splice(key) 应该可以工作,而 splice(key,x) 不能工作。只需从拼接函数中删除第二个参数。
  • 你认为哪个答案是正确的,让我看看是不是更好的答案,然后我会选择那个。
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2011-02-03
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多