1

在我的应用程序中,我需要从数组中删除一个元素。但是我是 JS 的新手。我在网上搜索,每篇博文都在谈论 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.

我使用角度 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

在您的代码的第二个循环中,您splice的数组只会更改五次。但是第六次(何时i等于 5),arr.splice(5, 1)操作将有效地导致无操作,因为您的数组已经只有 5 个元素。

您可以像在@MatteoTassinari 答案中那样修复它,或者只使用splice(0, 1)(或只是shift())而不是splice(i, 1).

于 2012-09-17T14:15:47.583 回答
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

当您拼接数组中的元素时,数组会变短。因此,循环的最后 5 次迭代会尝试拼接不存在的元素。

如果您将代码更改为:

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

它会按您的单元测试的预期工作。

于 2012-09-17T14:18:07.193 回答
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

splice您创建数组时(并删除一个数组元素),您还可以向前“移动”所有其他数组元素。

在任何拼接之前考虑这个数组:

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,当您继续执行 a 时ary.splice(1, 1),您不会删除第一个元素,而是实际上删除了第二个元素(2在这种情况下)

我知道这不是您要的,但是“重置”阵列的更有效方法是执行以下两件事之一:

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