使用delete运算符上的数组元素,而不是使用Array.splice方法之间的区别是什么?

例如︰

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

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

如果我可以删除数组元素,正如我可以与对象为何甚至有接合方法?

2009-02-01 11:11:16
问题评论:

这是复制的stackoverflow.com/questions/495764/...

在循环中的.splice ,有一看这个问题︰在 javascript 数组中删除.

@andynormancx 是,但此答案已发布仅一天后,而且有这么多更多的选票-我会说它更好地编写的这必须是它。

回答:

删除在这种情况下将仅将元素设置为未定义︰

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

接合实际上从数组中移除的元素︰

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

修正的第 3 行: [未定义,'b',而 'c',将 '] (它不是未定义的字符串,但未定义的特殊值)

为什么拼接而不是剪切吗?

实际上,delete does移除元素,但不重新编制索引数组或更新其长度 (这已经暗示前者因为长度始终是最大的索引 + 1)。

JSlint 不会像delete myArray[0]语法说"预期一个运算符,而是看到了 '删除'。"建议使用splice

@Eye︰ 实际上,JSLint 只抱怨缺少该运算符前一行一个分号。并且,因为他们做完全不同的事物不能确实建议过另一个,一个...

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);

张三的网站

Array.remove() 的 + 1。但是不快乐传递字符串参数 (与大多数不同阵列方法,如[1,2,3].slice('1'); // =[2,3]),因此将其更改为更安全var rest = this.slice(parseInt(to || from) + 1 || this.length);

@tomwrong,在 javascript 中,没有任何线程和该函数执行this.push.apply(this, rest),然后返回其返回的值

这根本不能回答的问题。

何不尝试使用 splice ()?此函数、 参数名称和结果的名称并不明显。我的建议是只需使用 splice(index,length)-(见安迪 Hume 答案)

只要上面作为解释了工作原理,尚未创建不希望的副作用循环访问数组与for(var i in array)周期时正常工作。我已将其删除,而改用接合。

因为删除仅从数组中的元素中移除对象,该数组的长度不会更改。接合中移除对象,并缩短了数组。

下面的代码将显示"a"、"b""未定义"、"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]);
}

除在第二个示例中使用的第 1 1,1 多义性的好例子指的是要启动接合的数组中的索引,第二个 1 是要移除的元素数。因此,要从原始数组中删除 'c',使用myArray.splice(2,1)

我发现到这个问题,试图了解如何从数组中删除元素的每个匹配项。这是比较splicedelete删除items数组的每个'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"]
​

对我来说非常有用的指南。提前感谢您...

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

删除数组元素时,不会影响数组长度。例如,如果您删除 [3],[4] 仍是 [4] 和 [3] 未定义。它将保存即使删除最后一个元素的数组 (删除 a[a.length-1])。

请输入您的翻译

Deleting array elements in JavaScript - delete vs splice

确认取消