在 JavaScript 中删除数组元素 - Delete 与 Splice

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

例如:

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

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

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

答案

delete将删除对象属性,但不会为数组重新索引或更新其长度。这使得它看起来好像是未定义的:

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> delete myArray[0]
  true
> myArray[0]
  undefined

请注意,实际上并没有将其设置为undefined ,而是从数组中删除了该属性,使其显得未定义。 Chrome 开发人员工具通过在记录阵列时将其打印为empty使这一区别清晰可见。

> myArray[0]
  undefined
> myArray
  [empty, "b", "c", "d"]

myArray.splice(start, deleteCount)实际上会删除该元素,为该数组重新索引并更改其长度。

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]

Array.remove()方法

jQuery 的创建者John Resig创建了一个非常方便的Array.remove方法,我一直在项目中使用它。

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

这是一些如何使用它的示例:

// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-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]);
}

在尝试了解如何从数组中删除元素的每次出现时,我偶然发现了这个问题。 这里有一个比较splicedelete去除每一个'c'items阵列。

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"]
​

Core JavaScript 1.5 参考 > 运算符 > 特殊运算符 > 删除运算符

删除数组元素时,数组长度不受影响。例如,如果删除 a [3],则 a [4] 仍为 a [4],而 a [3] 未定义。即使删除数组的最后一个元素(删除 a [a.length-1]),该设置仍然成立。

splice将与数字索引一起使用。

delete可以用于其他类型的索引。

例:

delete myArray['text1'];

值得一提的是,拼接仅适用于数组。 (不能依赖对象属性遵循一致的顺序。)

要从对象中删除键值对,删除实际上是您想要的:

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

如上所述,使用splice()似乎很合适。 Mozilla 上的文档:

splice()方法通过删除现有元素和 / 或添加新元素来更改数组的内容。

var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];

myFish.splice(2, 0, 'drum'); 
// myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"]

myFish.splice(2, 1); 
// myFish is ["angel", "clown", "mandarin", "sturgeon"]

句法

array.splice(start)
array.splice(start, deleteCount)
array.splice(start, deleteCount, item1, item2, ...)

参量

开始

开始更改数组的索引。如果大于数组的长度,则实际的起始索引将设置为数组的长度。如果为负,则将从头开始那么多元素。

deleteCount

一个整数,指示要删除的旧数组元素的数量。如果 deleteCount 为 0,则不会删除任何元素。在这种情况下,您应该至少指定一个新元素。如果 deleteCount 大于开始时数组中剩余的元素数,则将删除数组末尾的所有元素。

如果省略 deleteCount,则 deleteCount 等于(arr.length - start).

item1,item2,...

从起始索引开始,添加到数组中的元素。如果不指定任何元素,则splice()只会从数组中删除元素。

返回值

包含已删除元素的数组。如果仅删除一个元素,则返回一个元素的数组。如果没有删除任何元素,则返回一个空数组。

[...]

删除拼接

当您从数组中删除项目时

var arr = [1,2,3,4]; delete arr[2]; //result [1, 2, 3:, 4]
console.log(arr)

当你拼接时

var arr = [1,2,3,4]; arr.splice(1,1); //result [1, 3, 4]
console.log(arr);

如果删除 删除元素,索引保持为空

而在剪接元素被删除而其余元素索引相应减少的情况下

delete 的行为类似于非现实情况,它只是删除项目,但数组长度保持不变:

来自节点终端的示例:

> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]

这是一个使用slice()通过索引删除数组项的函数,它将 arr 作为第一个 arg,将要删除的成员的索引作为第二个参数。如您所见,它实际上删除了数组的成员,并将数组长度减少了 1

function(arr,arrIndex){
    return arr.slice(0,arrIndex).concat(arr.slice(arrIndex + 1));
}

上面的函数所做的是将所有成员移到索引,然后将所有成员移到索引之后,并将它们连接在一起,然后返回结果。

这是一个使用上面的函数作为节点模块的示例,看到终端将很有用:

> var arr = ["a","b","c","d"]
> arr
[ 'a', 'b', 'c', 'd' ]
> arr.length
4 
> var arrayRemoveIndex = require("./lib/array_remove_index");
> var newArray = arrayRemoveIndex(arr,arr.indexOf('c'))
> newArray
[ 'a', 'b', 'd' ] // c ya later
> newArray.length
3

请注意,这对一个包含重复项的数组将不起作用,因为 indexOf(“c”)只会得到第一个出现,并且只能剪接并删除找到的第一个 “c”。