如果我有一个JS关联数组,也就是一个对象,我想要删除其中一个元素,使用delete myArr[someId]
会将该元素设置为未定义,而splice根本不起作用...那么,如果我想要从关联数组中删除一个元素(而不是将其设置为undefined
),有什么替代方法呢?
如果我有一个JS关联数组,也就是一个对象,我想要删除其中一个元素,使用delete myArr[someId]
会将该元素设置为未定义,而splice根本不起作用...那么,如果我想要从关联数组中删除一个元素(而不是将其设置为undefined
),有什么替代方法呢?
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。
希望这有所帮助。
没有其他选择。myArr["someCrazyIndexYouHaventPreviouslyUsed"]
将返回undefined;关联数组总是为不存在的索引返回undefined
。
因此,删除myArr[someId]
将导致myArr
将someId
视为不存在的其他索引,这不正是您想要的吗?
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
undefined
就是最好的了。你可以为一个已经存在的对象添加一个属性并检查其类型,它将是undefined
。 - Jonathan Mdelete myArray[someID]
和myArray[someID]=undefined
之间的区别吗?如果是的话,我认为前者更好,因为后者在检查undefined
时会导致问题。 - puk