在数组元素上使用delete运算符与使用array.splice方法有什么区别?

例如:

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

delete myArray[1];
//  or
myArray.splice (1, 1);

如果我可以像删除对象那样删除数组元素,为什么还要使用拼接方法?


当前回答

因为delete只从数组中的元素中删除对象,所以数组的长度不会改变。拼接将删除对象并缩短阵列。

以下代码将显示“a”、“b”、“undefined”、“d”

myArray = ['a', 'b', 'c', 'd']; delete myArray[2];

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

而这将显示“a”、“b”、“d”

myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

其他回答

我在试图理解如何从数组中删除每一个元素时偶然发现了这个问题。这里是拼接和删除的比较,用于从项数组中删除每个“c”。

var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  items.splice(items.indexOf('c'), 1);
}

console.log(items); // ["a", "b", "d", "a", "b", "d"]

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

while (items.indexOf('c') !== -1) {
  delete items[items.indexOf('c')];
}

console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]
​

我有两种方法。

简单的一个:

arr = arr.splice(index,1)

第二个:

arr = arr.filter((v,i)=>i!==index)

第二种方法的优点是可以删除一个值(所有值,而不是像大多数情况一样只删除第一个实例)

arr = arr.filter((v,i)=>v!==value)

可能还值得一提的是,拼接仅适用于阵列。(不能依赖对象财产来遵循一致的顺序。)

要从对象中删除键值对,实际上需要删除:

delete myObj.propName;     // , or:
delete myObj["propName"];  // Equivalent.

好的,假设我们有下面这个数组:

const arr = [1, 2, 3, 4, 5];

让我们先删除:

delete arr[1];

结果是:

[1, empty, 3, 4, 5];

空的让我们来看看:

arr[1]; //undefined

所以意味着只是删除了值,现在它是未定义的,所以长度是相同的,也会返回true。。。

让我们重新设置阵列,这次使用拼接进行操作:

arr.splice(1, 1);

这是这次的结果:

[1, 3, 4, 5];

如您所见,数组长度已更改,arr[1]现在为3。。。

此外,这将返回数组中已删除的项目,在这种情况下为[3]。。。

对于那些想使用Lodash的人,可以使用:myArray=_.无(myArray,itemToRemove)

或如我在Angular2中所用

import { without } from 'lodash';
...
myArray = without(myArray, itemToRemove);
...