在关联数组上删除与拼接

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] 将导致 myArrsomeId 视为所有其他不存在的索引 - 这不是您想要的吗?

【讨论】:

根据 Geuis 的回答,该数组将“未定义”存储为实际值,然后,在您的回答中使用此信息,它还将为任何未定义的索引输出未定义,因此有点不同。 @JVE999 delete 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" ]

以上是关于在关联数组上删除与拼接的主要内容,如果未能解决你的问题,请参考以下文章

如何获取密钥然后删除未关联到数组的密钥? [复制]

如何从关联数组中删除键及其值?

从关联数组中删除键

如何从 JavaScript 关联数组中删除对象?

ActionScript 3 从关联数组中删除元素

从关联数组中删除元素