Javascript 为什么拼接方法会有这种奇怪的行为?
在我的应用程序中,我需要从数组中删除一个元素。然而,我对JS是新手。我在网上搜索,每一篇博文都在谈论splice()方法。所以我考虑使用它,但它有一个非常奇怪的行为 这是我找到的帖子: http://viralpatel.net/blogs/javascript-array-remove-element-js-array-delete-element/ 这是我的测试:Javascript 为什么拼接方法会有这种奇怪的行为?,javascript,angularjs,Javascript,Angularjs,在我的应用程序中,我需要从数组中删除一个元素。然而,我对JS是新手。我在网上搜索,每一篇博文都在谈论splice()方法。所以我考虑使用它,但它有一个非常奇怪的行为 这是我找到的帖子: http://viralpatel.net/blogs/javascript-array-remove-element-js-array-delete-element/ 这是我的测试: it("should delete all elements in array", function () { var
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);
});
我使用角度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建议的那样,应该删除所有元素,对吗 尝试替换此:
for (i = 0; i < 10; i++) {
ary.splice(i, 1);
}
如果要删除“c”,只需执行以下操作:
ary.splice(2, 1);
事实上,这里是必须删除的元素的基于0的索引。尝试替换此索引:
for (i = 0; i < 10; i++) {
ary.splice(i, 1);
}
如果要删除“c”,只需执行以下操作:
ary.splice(2, 1);
事实上,这里是必须删除的元素的基于0的索引。原因很简单:随着每个新的
拼接
,您的数组将变短:
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 answer中修复它,或者只使用
splice(0,1)
(或者只使用shift()
)而不是splice(i,1)
原因很简单:随着每个新的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-answer中修复它,或者只使用
splice(0,1)
(或者只使用shift()
)而不是splice(i,1)
要使其工作,您需要始终删除索引0
处的元素。否则,比如说,8
元素之后,您将执行ari.splice(8,1)
,鉴于此时数组只剩下2个元素,arr.splice(8,1)
不会删除任何元素,因为索引8
不再存在
for (i = 0; i < 10; i++) {
ary.splice(0, 1);
}
(i=0;i<10;i++)的{
三元拼接(0,1);
}
要使其工作,您需要始终删除索引0
处的元素。否则,比如说,8
元素之后,您将执行ari.splice(8,1)
,鉴于此时数组只剩下2个元素,arr.splice(8,1)
不会删除任何元素,因为索引8
不再存在
for (i = 0; i < 10; i++) {
ary.splice(0, 1);
}
(i=0;i<10;i++)的{
三元拼接(0,1);
}
从阵列拼接元素时,阵列会变短。因此,循环的最后5次迭代尝试拼接不存在的元素
如果将代码更改为:
for (i = 0; i < 10; i++) {
ary.splice(0, 1);
}
(i=0;i<10;i++)的{
三元拼接(0,1);
}
它将按照单元测试的预期工作。从阵列拼接元素时,阵列将变短。因此,循环的最后5次迭代尝试拼接不存在的元素
如果将代码更改为:
for (i = 0; i < 10; i++) {
ary.splice(0, 1);
}
(i=0;i<10;i++)的{
三元拼接(0,1);
}
它将按照单元测试的预期工作。当您拼接阵列(并移除一个阵列元素)时,您还可以向前“移动”所有其他阵列元素
在进行任何拼接之前,请考虑此阵列:
ary = [0,1,2,3,4,5,6,7,8,9]
在ari.splice(0,1)
之后,它如下所示:
ary = [1,2,3,4,5,6,7,8,9],
请注意,第0个索引(ary[0]
)现在是1
,当您继续执行ary.splice(1,1)
时,您不会删除第一个元素,而是实际删除第二个元素(在本例中为2
)
我知道这不是您想要的,但“重置”阵列的更有效方法是执行以下两项操作之一:
ary.length = 0;
// or:
ary = [];
当您拼接
阵列(并移除一个阵列元素)时,您还可以向前“移动”所有其他阵列元素
在进行任何拼接之前,请考虑此阵列:
ary = [0,1,2,3,4,5,6,7,8,9]
在ari.splice(0,1)
之后,它如下所示:
ary = [1,2,3,4,5,6,7,8,9],
请注意,第0个索引(ary[0]
)现在是1
,当您继续执行ary.splice(1,1)
时,您不会删除第一个元素,而是实际删除第二个元素(在本例中为2
)
我知道这不是您想要的,但“重置”阵列的更有效方法是执行以下两项操作之一:
ary.length = 0;
// or:
ary = [];
这一个有效,但我如何删除我想要的元素$scope.deleteElement=函数(索引){$scope.List.splice(索引,1);};我刚刚在firefox的firebug控制台上试用过,我的例子非常好用。你是否可能通过了错误的索引?另外,我不确定你之前评论中的那个函数是什么…这个函数起作用了,但是我如何删除我想要的元素呢$scope.deleteElement=函数(索引){$scope.List.splice(索引,1);};我刚刚在firefox的firebug控制台上试用过,我的例子非常好用。你是否可能通过了错误的索引?此外,我不确定您之前的评论中的函数是什么……除了给出的答案之外,我要指出的是,清空数组非常简单:arr.length=0
到您的编辑:不,他没有,您应该尝试阅读我们的答案。它们都指出,从数组中删除元素时,数组元素的索引会发生更改。如果要从数组中删除所有元素,请使用arr=[]
。如果需要重用同一对象并避免垃圾收集,请使用arr.splice(0,arr.length)
将length设置为0或splice
在一次调用中取出所有元素。