在关联数组中,删除(delete)和剪切(splice)有何区别?

47

如果我有一个JS关联数组,也就是一个对象,我想要删除其中一个元素,使用delete myArr[someId]会将该元素设置为未定义,而splice根本不起作用...那么,如果我想要从关联数组中删除一个元素(而不是将其设置为undefined),有什么替代方法呢?


为什么要删除它?它在那里有什么问题吗?undefined就是最好的了。你可以为一个已经存在的对象添加一个属性并检查其类型,它将是undefined - Jonathan M
1
你是在询问 delete myArray[someID]myArray[someID]=undefined 之间的区别吗?如果是的话,我认为前者更好,因为后者在检查 undefined 时会导致问题。 - puk
2个回答

172

JavaScript 中的术语一开始可能会令人困惑,因此让我们首先澄清一下。

是的,几乎所有 JavaScript 中的东西都是对象。不过,数据类型有所不同。

数组可以像关联数组一样使用,但与对象字面量不同。

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' };

然而,这就是你需要理解它们之间的区别。

你可以使用类似对象字面量的数组,但你不能像使用数组一样使用对象字面量。

数组有自动计算“length”属性,该属性会根据数组中元素的总数自动增加和减少。但对象字面量则没有这个特性。数组还具有其他特定于数组的方法,如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" }
如果您在数组中删除一个元素,数组的长度不会改变。元素的索引将保留,并且该值将设置为“undefined”; 相反,对对象字面量执行删除操作将从对象中删除键/值。 最后,如果您想从数组中删除元素。
var x = ['a', 'b']; 
x.splice(0,1); //modifies x. ['b']

总之,在对象字面量上使用delete。在数组上使用splice。

希望这有所帮助。


当一个一个定义项目时,拼接数组不起作用...请参见http://stackoverflow.com/questions/21896167/nodejs-array-splice-associate-array-does-not-work 我正在尝试理解这里发生了什么... - Brian McGinity
让我们重新考虑数组:http://jsperf.com/delete-vs-splice看起来 Chrome 36 现在删除速度更快了,“即时编译”在这里起了帮助作用。 - sushicutta
@sushicutta 问题不在于速度,而在于删除后数组的长度是多少。 - Stephen S

5

没有其他选择。myArr["someCrazyIndexYouHaventPreviouslyUsed"]将返回undefined;关联数组总是为不存在的索引返回undefined

因此,删除myArr[someId]将导致myArrsomeId视为不存在的其他索引,这不正是您想要的吗?


根据Geuis的回答,数组将"undefined"存储为实际值,因此根据您的回答,对于任何未定义的索引,它也将输出undefined,因此有点不同。 - JVE999
@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" ] - cychoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接