具有负值索引的array.splice意外行为

时间:2019-03-24 06:30:14

标签: javascript arrays

我注意到 开始参数 的描述中提到了MDN

  • 开始更改数组的索引(原点为0)
  • 如果为负数,将从数组(原点为-1)
  • 的末尾开始

此说明对我来说对删除元素非常有用:

删除第一个元素:

let foo = ["a", "b", "c"];
foo.splice(0,1) // "a" removed
console.log(foo);//["b", "c"]

删除最后个元素:

let foo = ["a", "b", "c"];
foo.splice(-1,1) // "c" removed
console.log(foo);//["a", "b"]

现在让我们尝试添加元素

第一处添加元素:

let foo = ["a", "b", "c"];
foo.splice(0,0,"x") // "x" added to 1st
console.log(foo);//["x", "a", "b", "c"]

在最后一个元素中添加元素

let foo = ["a", "b", "c"];
foo.splice(-1,0,"x") 
// I expected to added "x" as a last element
// but instead it shows ["a", "b", "x", "c"]
console.log(foo);

谁能解释为什么?

最后一种情况显示[“ a”,“ b”,“ x” 和“ c”]

如果您想从其位置移除相同的元素,则应将其从-2而不是-1的索引中移除:

let foo = ["a", "b", "c"];
foo.splice(-1,0,"x")
console.log(foo);
//["a", "b", "x", "c"]
foo.splice(-2,1)
console.log(foo);

谢谢...

2 个答案:

答案 0 :(得分:2)

最初,我们将foo视为["a", "b", "c"],而foo.length为3。

因此,当您使用foo.splice(-1,0,"x")添加元素时,索引的计算方式为foo.length - 1,即2。

因此,将新元素插入到索引2:

["a", "b", "c"]
  0    1    2
            ^
            |__________"x" added here 

因此,当在索引2处插入“ x”并且将“ c”移位一个索引时,新数组将变为["a", "b", "x", "c"]

使用foo.splice(-2,0)删除元素时,其被删除的索引foo.length - 2为2:

["a", "b", "x", "c"]
  0    1    2    3
            ^
            |__________ "x" is removed

该数组变为["a", "b", "c"]

答案 1 :(得分:0)

Splice function接受三个参数,

  • start:从何处更改数组的索引。
  • deleteCount:要删除的元素数。
  • items(varargs):要添加的元素,从start索引开始。
let foo = ["a", "b", "c"];
foo.splice(-1,0,"x") 
// I expected to added "x" as a last element
// but instead it shows ["a", "b", "x", "c"]
console.log(foo);

在上面的代码段中,您将start传递为-1,因此将它添加到最后一个索引(按arr.length - 1计算)和deleteCount上作为0进行添加,因此没有元素被删除,而是将它们向右移动一个索引。