题 在JavaScript中删除数组元素 - 删除vs splice


使用之间有什么区别 delete 操作者 在数组元素而不是使用 Array.splice 方法

例如:

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

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

如果我能用对象删除数组元素,为什么甚至有拼接方法呢?


1177
2018-02-01 11:11


起源


对于 .splice 在循环中,看看这个问题: 在javascript中从数组中删除。 - Rob W
@andynormancx是的,但是这个答案是在第二天发布的,并得到了更多的选票 - 我说它写得更好,一定是它。 - Camilo Martin
@andynormancx - 它似乎并不完全重复。您链接的问题基本上是问为什么从数组中删除元素(从而使其稀疏)不会减少其长度。这个问题是要求它们之间的区别 delete 和 Array.prototype.splice。 - chharvey
@chharvey同意了,更重要的是,这个问题怎么能在9年前发布!让我感觉自己回到这里评论它 - andynormancx


答案:


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

1542
2018-02-01 11:16



第3行的修正:[未定义,'b','c','d'](它不是字符串'undefined',而是特殊值undefined) - Jasper
其实, delete  不 删除元素,但不重新索引数组或更新其长度(前者已暗示,因为长度始终是最高索引+ 1)。 - Felix Kling
JSlint不喜欢 delete myArray[0] 语法说“期待操作员,而是看到'删除'。“使用 splice 被推荐。 - Eye
@Eye:实际上,JSLint只是抱怨前一行没有分号。你不能真正推荐一个,因为他们做了完全不同的事情...... - Ry-♦
“在这种情况下删除只会将元素设置为undefined:” 不,这完全不正确。两者之间存在根本区别 delete myArray[0] 和 myArray[0] = undefined。在前一种情况下,属性将完全从数组对象中删除。在第二种情况下,财产保留,具有价值 undefined。 - T.J. Crowder


Array.remove()方法

John Resig,jQuery的创建者创建了一个非常方便 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);

约翰的网站


321
2018-03-22 00:51



+1 For Array.remove()。然而,传递字符串参数并不高兴(与大多数Array方法不同,例如 [1,2,3].slice('1'); // =[2,3]),所以将其更改为更安全 var rest = this.slice(parseInt(to || from) + 1 || this.length); - Richard Inglis
@tomwrong,javascript中没有线程,函数执行 this.push.apply(this, rest),然后返回它返回的值 - billy
这根本不回答这个问题。 - Ry-♦
为什么不使用splice()?该函数的名称,参数名称和结果不明显。我的建议是使用拼接(索引,长度) - (参见Andy Hume的回答) - auco
上面提供的函数按照解释的方式工作,但在迭代数组时会产生不必要的副作用 for(var i in array) 周期。我删除了它并使用了拼接。 - alexykot


因为delete仅从数组中的元素中删除对象,所以数组的长度不会更改。 Splice删除对象并缩短数组。

以下代码将显示“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]);
}

95
2018-02-01 11:13



一个很好的例子,除了第二个例子中的歧义使用1,1 - 第一个1指的是数组中的索引来启动拼接,第二个1是要删除的元素的数量。因此,要从原始数组中删除“c”,请使用 myArray.splice(2,1) - iancoleman


我偶然发现了这个问题,同时试图了解如何从Array中删除每一个元素。 这是一个比较 的 splice 和 delete 删除每一个 '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"]
​

60
2018-05-09 13:25



对我来说非常有用的指南。提前致谢... - Cataclysm


 核心JavaScript 1.5参考>运算符>特殊运算符>删除运算符 :

删除数组元素时,   数组长度不受影响。对于   例如,如果删除[3],则[4]为   仍然是[4]和[3]未定义。这个   即使您删除了最后一个也保留   数组的元素(删除   一个[则为a.length-1])。


13
2018-02-01 11:16





splice 将使用数字索引。

delete 可用于对抗其他类型的指数..

例:

delete myArray['text1'];

9
2018-01-11 07:52



当你说'任何其他类型的索引'时,你不再讨论数组,而是讨论对象,这就是OP所要求的。 - Yi Jiang
@YiJiang:数组是对象。 Indizes属性。没有区别。 - Bergi


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

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

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

9
2017-08-01 20:11



delete不对数组键重新排序,因此:var arr = [1,2,3,4,5];删除arr [3]; for(var i = 0; i <= arr.length; i ++)console.log(arr [i]);会出现意想不到的结果 - Kristian Williams
这是真的。因此,除非您想在该位置留下未定义的项目,否则请勿在数组的键上使用delete!我最初添加此评论以包含正确使用删除的参考。 - jtrick