在关联数组上删除vs splice

时间:2011-11-17 19:40:01

标签: javascript arrays associative-array

如果我有一个JS关联数组,它来自我收集的实际上是一个对象,并且我希望删除一个元素,使用delete myArr[someId]将元素设置为undefined,而splice将根本不起作用...如果我想删除一个元素(而不是将其设置为undefined),那么关联数组的替代方法是什么?

2 个答案:

答案 0 :(得分:164)

js中的术语起初可能会令人困惑,所以让我们理顺它。

是的,几乎js中的所有东西都是一个对象。但是,数据类型存在差异。

数组可以像一样用作关联数组,但它与对象文字不同。

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" }

如果对数组的元素执行删除操作,则数组的长度不会更改。元素索引被保留,值设置为'undefined';

相反,对对象文字执行删除会从对象中删除键/值。

最后,如果要从数组中删除元素。

var x = ['a', 'b']; 
x.splice(0,1); //modifies x. ['b']

因此,总结一下,在对象文字上使用delete。在阵列上使用拼接。

希望这有帮助。

答案 1 :(得分:5)

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

因此,删除myArr[someId]会导致myArr像其他所有不存在的索引一样对待someId - 这不是您想要的吗?