在关联数组上删除vs splice

sar*_*ake 45 javascript arrays associative-array

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

Geu*_*uis 167

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

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

数组可以关联数组一样使用,但它与对象文字不同.

var x = []; //array
var y = {}; //object literal
Run Code Online (Sandbox Code Playgroud)

数组就像一个列表.数组的键可以是数字索引或字符串.

var x = ['a','b']; // x[0] === 'a', x[1] === 'b';
var x = [];
    x['one'] = 'a';
    x['blah'] = 'b'; 
Run Code Online (Sandbox Code Playgroud)

对象文字就像字典.它们可以以类似的方式使用.

var x = { 0: 'a', 1: 'b' };
var x = { one: 'a', two: 'b' };
Run Code Online (Sandbox Code Playgroud)

但是,您需要了解这些差异.

您可以对象文字一样使用数组,但不能像数组一样使用对象文字.

数组具有自动"长度"属性,该属性根据数组中元素的总数自动递增和递减.你没有得到对象文字.数组也可以获得所有其他特定于数组的方法,如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" }
Run Code Online (Sandbox Code Playgroud)

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

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

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

var x = ['a', 'b']; 
x.splice(0,1); //modifies x. ['b']
Run Code Online (Sandbox Code Playgroud)

因此,总结一下,在对象文字上使用delete.在数组上使用拼接.

希望这可以帮助.


Ada*_*kis 5

没有其他选择. myArr["someCrazyIndexYouHaventPreviouslyUsed"]将返回undefined; 关联数组将始终为您undefined提供不存在的索引.

所以删除myArr[someId]会导致像其他不存在的索引一样myArr对待 - someId不是你想要的吗?