Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么拼接方法会有这种奇怪的行为?_Javascript_Angularjs - Fatal编程技术网

Javascript 为什么拼接方法会有这种奇怪的行为?

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

在我的应用程序中,我需要从数组中删除一个元素。然而,我对JS是新手。我在网上搜索,每一篇博文都在谈论splice()方法。所以我考虑使用它,但它有一个非常奇怪的行为

这是我找到的帖子: 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);

});
我使用角度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
在一次调用中取出所有元素。