当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在JavaScript中删除数组元素-删除vssplice》经验,为你挑选了12个好方法。

是什么使用之间的差值的delete算子阵列元件上,而不是使用该Array.splice方法?

例如:

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

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

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



1> Andy Hume..:

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


实际上,`delete`*确实*删除了元素,但没有重新索引数组或更新它的长度(由于长度始终是最高的索引+ 1,因此前者已经暗示了这一长度).
@Eye:实际上,JSLint只是抱怨前一行没有分号.你不能真正推荐一个,因为他们做了完全不同的事情......
JSlint不喜欢`delete myArray [0]`语法说"**预期运算符而是看'删除'.**"建议使用`splice`.
*"在这种情况下删除只会将元素设置为未定义:"*不,这完全不正确.`delete myArray [0]`和`myArray [0] = undefined`之间存在根本区别.在前一种情况下,属性将完全从数组对象中删除.在第二种情况下,属性保留,值为"undefined".

2> Mohsen..:
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);

约翰的网站


这根本不回答这个问题.
为什么不使用splice()?该函数的名称,参数名称和结果不明显.我的建议是使用拼接(索引,长度) - (参见Andy Hume的回答)
+1 For Array.remove().然而,传递字符串参数并不高兴(与大多数数组方法不同,例如`[1,2,3] .slice('1'); // = [2,3]`),因此将其更改为更安全var rest = this.slice(parseInt(to || from)+ 1 || this.length);`
上面提供的函数按照解释的方式工作,但是当使用`for(var i in array)`循环遍历数组时,它会产生不必要的副作用.我删除了它并使用了拼接.
@tomwrong:我的意思是javascript是单线程的

3> andynormancx..:

因为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]);
}


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

4> Troy Harvey..:

我偶然发现了这个问题,同时试图了解如何从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"]
?



5> f3lix..:

从Core JavaScript 1.5参考>运算符>特殊运算符> delete运算符:

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



6> 小智..:

splice 将使用数字索引.

delete可以用来对付其他类型的指数..

例:

delete myArray['text1'];


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

7> jtrick..:

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

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

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



8> serv-inc..:

如上所述,使用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大于从start开始的数组中剩余的元素数,则将删除通过数组末尾的所有元素.

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

item1,item2,...

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

返回值

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

[...]



9> ashish yadav..:

删除Vs拼接

从数组中删除项目时

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


10> med116..:

删除行为就像一个非现实世界的情况,它只是删除项目,但数组长度保持不变:

节点终端的示例:

> 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

请注意,这对于一个带有dupes的数组不起作用,因为indexOf("c")只会获得第一次出现,并且只能拼接并删除它找到的第一个"c".



11> 小智..:

如果你想迭代一个大数组并有选择地删除元素,那么为每次删除调用splice()都会很昂贵,因为splice()每次都必须重新索引后续元素.因为数组在Javascript中是关联的,所以删除单个元素然后重新索引数组会更有效.

您可以通过构建新数组来实现.例如

function reindexArray( array )
{
       var result = [];
        for( var key in array )
                result.push( array[key] );
        return result;
};

但我认为你不能修改原始数组中的键值,这样会更有效 - 看起来你可能需要创建一个新数组.

请注意,您不需要检查"未定义"条目,因为它们实际上并不存在,并且for循环不会返回它们.它是阵列打印的工件,将它们显示为未定义.它们似乎不存在于内存中.

如果你可以使用像slice()这样更快的东西,但它不会重新索引会很好.谁知道更好的方法?


实际上,您可以按照以下方式执行此操作,这可能更有效,性能更高:

reindexArray : function( array )
{
    var index = 0;                          // The index where the element should be
    for( var key in array )                 // Iterate the array
    {
        if( parseInt( key ) !== index )     // If the element is out of sequence
        {
            array[index] = array[key];      // Move it to the correct, earlier position in the array
            ++index;                        // Update the index
        }
    }

    array.splice( index );  // Remove any remaining elements (These will be duplicates of earlier items)
},



12> Zeeshan Sale..:

你可以使用这样的东西

var my_array = [1,2,3,4,5,6];
delete my_array[4];
console.log(my_array.filter(function(a){return typeof a !== 'undefined';})); // [1,2,3,4,6]
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有