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

質問 : in line ***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 コンソールに貼り付けてテストできます。

4

3 に答える 3

11

キーをループしているときに配列からアイテムを削除しているため、機能していません。アイテムを削除すると、配列が内部でどのように実装されているかに応じて他のアイテムが再配置され、期待するキーを反復処理しないループが発生します。

Firefox で試してみると0、 、12および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);

デモ: http://jsfiddle.net/CguTp/1/

于 2013-07-02T18:10:34.683 に答える
3

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--;
            }
        }
于 2013-07-02T15:52:22.790 に答える