在数组元素上使用the delete operator与使用the Array.splice method相比有什么区别?
例如:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
如果我能用对象删除数组元素,为什么甚至有拼接方法呢?
在数组元素上使用the delete operator与使用the Array.splice method相比有什么区别?
例如:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
如果我能用对象删除数组元素,为什么甚至有拼接方法呢?
23 回答
来自Core JavaScript 1.5 Reference > Operators > Special Operators > delete Operator:
delete Vs splice
从数组中删除项目时
当你拼接
如果 delete element is deleted 但是 index remains empty
而在 splice 元素被删除的情况下 index of rest elements is reduced accordingly
例:
banana被删除,数组长度= 2
最简单的方法可能就是
希望这可以帮助 . 参考:https://lodash.com/docs#compact
好的,想象我们下面有这个数组:
我们先删除:
这就是结果:
empty! 让我们明白:
所以意味着只删除了值,它现在是 undefined ,所以长度是相同的,它也将返回 true ...
让我们重置我们的数组,这次拼接:
这次是结果:
如您所见,数组长度已更改,
arr[1]
现在为 3 ...此外,这将返回数组中已删除的项目,在这种情况下
[3]
...你可以使用这样的东西
应该显示[1,2,3,4,6]
如果你想迭代一个大数组并有选择地删除元素,那么为每次删除调用splice()都会很昂贵,因为splice()每次都必须重新索引后续元素 . 因为数组在Javascript中是关联的,所以删除单个元素然后重新索引数组会更有效 .
您可以通过构建新数组来实现 . 例如
但我认为您不能修改原始数组中的键值,这样会更有效 - 看起来您可能需要创建一个新数组 .
请注意,您不需要检查“未定义”条目,因为它们实际上并不存在,并且for循环不会返回它们 . 它是阵列打印的工件,将它们显示为未定义 . 它们似乎不存在于内存中 .
如果你可以使用像slice()这样的东西会更快,但它不会重新索引会很好 . 谁知道更好的方法?
实际上,您可以按照以下方式执行此操作,这可能更有效,性能更高:
如果要删除的所需元素位于中间(假设我们要删除'c',其索引为1):
var arr = ['a','b','c'];
你可以使用:
var indexToDelete = 1; var newArray = arr.slice(0, indexToDelete).combine(arr.slice(indexToDelete+1, arr.length))
值得一提的是,splice只适用于数组 . (不能依赖对象属性来遵循一致的顺序 . )
要从对象中删除键值对,删除实际上是您想要的:
我偶然发现了这个问题,同时试图了解如何从Array中删除每个元素 . Here's a comparison的
splice
和delete
用于从items
数组中删除每个'c'
.如上所述,使用
splice()
似乎是完美的选择 . Documentation at Mozilla:myFish.splice(2,0,'鼓');
// myFish是[“天使”,“小丑”,“鼓”,“普通话”,“鲟鱼”]
myFish.splice(2,1);
// myFish是[“天使”,“小丑”,“普通话”,“鲟鱼”]
语法array.splice(start)
array.splice(start,deleteCount)
array.splice(start,deleteCount,item1,item2,...)
参数start要开始更改数组的索引 . 如果大于数组的长度,实际的起始索引将设置为数组的长度 . 如果否定,将从最后开始那么多元素 . deleteCount一个整数,指示要删除的旧数组元素的数量 . 如果deleteCount为0,则不删除任何元素 . 在这种情况下,您应该至少指定一个新元素 . 如果deleteCount大于从start开始的数组中剩余的元素数,则将删除通过数组末尾的所有元素 . 如果省略deleteCount,则deleteCount将等于(arr.length - start) . item1,item2,...从开始索引开始添加到数组的元素 . 如果未指定任何元素,则splice()将仅从数组中删除元素 . 返回值包含已删除元素的数组 . 如果仅删除一个元素,则返回一个元素的数组 . 如果未删除任何元素,则返回空数组 . [...]
它们是具有不同目的的不同事物 .
splice
是特定于阵列的,当用于删除时,从数组中删除条目并移动所有先前的条目条目填补空白 . (它也可以用于同时插入条目或两者 . )splice
将更改数组的length
(假设它不是无操作调用:theArray.splice(x, 0)
) .delete
不是特定于数组的;它设计用于对象:它从您使用它的对象中删除属性(键/值对) . 它仅适用于数组,因为JavaScript aren't really arrays at all *中的标准(例如,非类型)数组,它们是对某些属性具有特殊处理的对象,例如名称为"array indexes"的那些(其为defined作为字符串名称“......数值i
在+0 ≤ i < 2^32-1
“)和length
范围内 . 当您使用delete
删除数组条目时,它只是删除条目;它不会移动其他条目以填补空白,因此数组变为"sparse"(完全缺少某些条目) . 它对length
没有影响 .这个问题的当前几个答案错误地指出使用
delete
“将条目设置为undefined
” . 那不对 . 它完全删除了条目(属性),留下了空白 .让我们用一些代码来说明差异:
*(这是我贫血的小博客上的帖子)
IndexOf
也接受引用类型 . 假设以下场景:以不同的方式:
//结果:myArray = ['b','c','d'];
delete
将删除对象属性,但不会重新索引数组或更新其长度 . 这使它看起来好像是未定义的:请注意,它实际上未设置为值
undefined
,而是从数组中删除属性,使其显示为未定义 . Chrome开发工具通过在记录数组时打印empty
来明确区分 .myArray.splice(start, deleteCount)实际上删除了元素,重新索引数组,并更改其长度 .
Array.remove()方法
John Resig ,jQuery的创建者创建了一个非常方便的
Array.remove
方法,我总是在我的项目中使用它 .以下是一些如何使用它的例子:
John's website
splice
将使用数字索引 .而
delete
可用于对抗其他类型的指数 .例:
因为delete仅从数组中的元素中删除对象,所以数组的长度不会更改 . Splice删除对象并缩短数组 .
以下代码将显示“a”,“b”,“undefined”,“d”
而这将显示“a”,“b”,“d”
对于那些想要使用Lodash的人可以使用:
myArray = _.without(myArray, itemToRemove)
或者我在Angular2中使用
delete 就像一个非现实世界的情况,它只是删除了项目,但数组长度保持不变:
来自节点终端的示例:
这是一个通过索引删除数组项的函数,使用 slice() ,它将arr作为第一个arg,并将要删除的成员的索引作为第二个参数 . 如您所见,它实际上删除了数组的成员,并将数组长度减少1
上面的函数是将所有成员带到索引,以及索引之后的所有成员,并将它们连接在一起,然后返回结果 .
这是一个使用上面的函数作为节点模块的示例,看到终端将是有用的:
请注意,这对于一个带有dupes的数组不起作用,因为indexOf(“c”)只会获得第一次出现,并且只能拼接并删除它找到的第一个“c” .
为什么不过滤?我认为这是在js中考虑数组的最明确的方法 .
目前有两种方法可以做到这一点
arrayObject.splice(index, 1);
delete arrayObject[index];
但我总是建议对数组对象使用splice并删除对象属性,因为delete不会更新数组长度 .
从最后删除元素
从第一个删除元素
从中间删除
从最后删除一个元素
使用数组索引号删除