簡體   English   中英

Javascript數組拼接無法正常工作

[英]Javascript Array Splice Not working fine

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控制台中復制和粘貼代碼以進行測試。

它不起作用,因為在循環遍歷鍵時要從數組中刪除項目。 當您刪除一個項目時,它將根據內部實現數組的方式重新排列其他項目,最終您將得到一個循環,該循環不會迭代您期望的鍵。

當我嘗試在Firefox,它只遍歷鍵012r 迭代時刪除項目將使其跳過34 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);

演示: 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)拼接期望索引是第一個參數,而不是鍵

看到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希望第一個索引為數字,

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)等,因此可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM