1

私のアプリケーションでは、配列から要素を削除する必要があります。しかし、私はJSが初めてです。Web を検索したところ、すべてのブログ投稿が splice() メソッドについて話していました。それで使おうと思ったのですが、とても変な挙動をしています。

ここで私が見つけた投稿: http://www.w3schools.com/jsref/jsref_splice.asp http://viralpatel.net/blogs/javascript-array-remove-element-js-array-delete-element/

これが私のテストです:

it("should delete all elements in array", function () {
    var ary = new Array();

    for (i = 0; i < 10; i++) {
        ary[i] = Math.random();
    }

    expect(ary.length).toBe(10);

    for (i = 0; i < 10; i++) {
        ary.splice(i, 1);
    }

    expect(ary.length).toBe(0);

});

そして、ここにテストの結果があります:

  Firefox 15.0.1 Linux: Run 7 tests (Passed: 6; Fails: 1; Errors 0) (44.00 ms)
    should delete all elements in array failed (5.00 ms): Error: Expected 5 to be 0.

私はAngular JSを使用しています。

返信ありがとうございます。合格しない別のテストを次に示します。

var ary = new Array();

        ary = ['a', 'b', 'c', 'd'];

        ary.splice(0, 1);

        ary.splice(1, 1);

        ary.splice(2, 1);

        ary.splice(3, 1);

        expect(ary.length).toBe(0);

Firefox 15.0.1 Linux: Run 7 tests (Passed: 6; Fails: 1; Errors 0) (49.00 ms)
    Posting server policy.should delete all elements in array failed (5.00 ms): Error: Expected 2 to be 0.

@Matteo Tassinariが示唆しているように、これはすべての要素を正しく削除する必要があります??

4

5 に答える 5

3

理由は簡単です。新しい配列ごとspliceに、配列が短くなります。

var arr = [1, 2, 3];
arr.splice(0, 1);
console.log(arr[0]); // 2
console.log(arr[2]); // undefined
console.log(arr.length); // 2

コードの 2 番目のループではsplice、配列が 5 回だけ変更されます。しかし、6 回目 (いつi5 に等しいか) ではarr.splice(5, 1)、配列はすでに 5 つの要素しかないため、操作は事実上ノーオペレーションになります。

@MatteoTassinariの回答のように修正するか、の代わりにsplice(0, 1)(または単に)使用することができます。shift()splice(i, 1)

于 2012-09-17T14:15:47.583 に答える
1

これを置き換えてみてください:

for (i = 0; i < 10; i++) {
    ary.splice(i, 1);
}

これとともに:

for (i = 0; i < 10; i++) {
    ary.splice(0, 1);
}

特定の要素を削除するには、たとえば次のように指定します。

ary = ['a', 'b', 'c', 'd'];

「c」を削除したい場合は、次のようにします。

ary.splice(2, 1);

実際、ここの 2 は、削除する必要がある要素の 0 から始まるインデックスです。

于 2012-09-17T14:15:43.330 に答える
1

それが機能するには、 index の要素を常に削除する必要があります0。それ以外の場合は、たとえば、8要素の後に を実行ary.splice(8, 1)し、この時点で配列には2要素しか残っておらず、インデックスが存在arr.splice(8, 1)しないため削除されません。8

for (i = 0; i < 10; i++) {
    ary.splice(0, 1);
}
于 2012-09-17T14:17:24.963 に答える
1

配列をsplice作成する (そして 1 つの配列要素を削除する) と、他のすべての配列要素も前方に「移動」します。

スプライシングの前に、次の配列を検討してください。

ary = [0,1,2,3,4,5,6,7,8,9]

の後ary.splice(0,1)、次のようになります。

ary = [1,2,3,4,5,6,7,8,9],

0 番目のインデックス ( ary[0]) が1になり、 を実行すると、最初の要素は削除されませんary.splice(1, 1)が、実際には2 番目の要素が削除されます (この場合)。2

これはあなたが求めているものではないことはわかっていますが、配列を「リセット」するより効率的な方法は、次の 2 つのいずれかを行うことです。

ary.length = 0;
// or:
ary = [];
于 2012-09-17T14:20:24.767 に答える
1

配列から要素をスプライスすると、配列は短くなります。その結果、ループの最後の 5 回の反復で、存在しない要素をつなぎ合わせようとします。

コードを次のように変更した場合:

for (i = 0; i < 10; i++) {
    ary.splice(0, 1);
}

単体テストで期待どおりに機能します。

于 2012-09-17T14:18:07.193 に答える