在关联数组上删除与拼接
Posted
技术标签:
【中文标题】在关联数组上删除与拼接【英文标题】:Delete vs splice on associative array 【发布时间】:2011-12-31 16:09:39 【问题描述】:如果我有一个 JS 关联数组,它来自我收集的真正的对象,并且我希望删除一个元素,使用 delete myArr[someId]
会将元素设置为未定义,而 splice 根本不起作用.. . 那么如果我想删除一个元素(而不是将其设置为undefined
),关联数组的替代方法是什么
【问题讨论】:
为什么要删除它?呆在里面有什么痛处?undefined
尽其所能。您可以为已建立的对象组成一个属性并检查其类型,它将是undefined
。
你问的是delete myArray[someID]
和myArray[someID]=undefined
的区别吗?如果是这样,我认为前者更好,因为后者在检查undefined
时会导致问题
【参考方案1】:
js 中的术语一开始可能会让人感到困惑,所以让我们理顺一下。
是的,js 中几乎所有的东西都是一个对象。但是,数据类型存在差异。
数组可以like用作关联数组,但它不同于对象字面量。
var x = []; //array
var y = ; //object literal
数组就像一个列表。数组的键可以是数字索引或字符串。
var x = ['a','b']; // x[0] === 'a', x[1] === 'b';
var x = [];
x['one'] = 'a';
x['blah'] = 'b';
对象字面量就像字典。它们可以以类似的方式使用。
var x = 0: 'a', 1: 'b' ;
var x = one: 'a', two: 'b' ;
但是,这是您需要了解差异的地方。
你可以使用数组像对象字面量,但你不能像数组一样使用对象字面量。
数组具有自动的“长度”属性,该属性会根据数组中元素的总数自动递增和递减。你不会用对象文字得到这个。数组还可以获取所有其他特定于数组的方法,例如 shift、unshift、splice、pop、push 等。对象字面量没有这些方法。
让我们谈谈删除以及在数组和对象字面量上发生的事情。
var x = ['a', 'b']; //["a", "b"]
delete x[0]; //[undefined, "b"]
var x = 0:'1', 1:'b'// 0:"1", 1:"b"
delete x[0]; // 1:"b"
如果您对数组的元素执行删除,则数组的长度不会改变。保留元素索引,并将值设置为“未定义”;
相反,对对象字面量执行删除操作会从对象中删除键/值。
最后,如果你想从数组中移除一个元素。
var x = ['a', 'b'];
x.splice(0,1); //modifies x. ['b']
因此,总而言之,对对象字面量使用 delete。在数组上使用拼接。
希望这会有所帮助。
【讨论】:
在逐个定义项目时拼接数组不起作用...请参阅***.com/questions/21896167/…我正在尝试了解这里发生了什么... !!!让我们重新考虑数组:jsperf.com/delete-vs-splice 看起来 Chrome 36 现在可以更快地删除,“即时编译”在这里有所帮助。 @sushicutta 问题不是速度,问题是移除后数组的长度是多少。【参考方案2】:没有其他选择。 myArr["someCrazyIndexYouHaventPreviouslyUsed"]
将返回未定义;对于不存在的索引,关联数组将始终为您提供undefined
。
因此,删除 myArr[someId]
将导致 myArr
将 someId
视为所有其他不存在的索引 - 这不是您想要的吗?
【讨论】:
根据 Geuis 的回答,该数组将“未定义”存储为实际值,然后,在您的回答中使用此信息,它还将为任何未定义的索引输出未定义,因此有点不同。 @JVE999delete array[index]
是否存储(或显示)undefined
取决于 JS 引擎的实现。至少从 Firefox 51.0.1 开始,!function()var x=['a','b']; console.log(x); delete x[0]; console.log(x);()
返回 Array [ "a", "b" ] Array [ <1 empty slot>, "b" ]
以上是关于在关联数组上删除与拼接的主要内容,如果未能解决你的问题,请参考以下文章