Удалить vs сплайсинг на ассоциативном массиве

Если у меня есть ассоциативный массив JS, который из того, что я собираю, действительно является объектом, и я хочу удалить элемент, использование delete myArr[someId] установит элемент в undefined, в то время как сращивание не будет работать вообще... так что альтернатива для ассоциативного массива, если я хочу удалить элемент (а не установить его на undefined)

Ответ 1

Терминология в 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' };

Однако здесь вам нужно понять различия.

Вы можете использовать массив как литерал объекта, но вы не можете использовать литерал объекта как массив.

Массивы имеют автоматическое свойство 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 для объектных литералов. Используйте сплайсинг на массивах.

Надеюсь, что это поможет.

Ответ 2

Другого варианта нет. myArr["someCrazyIndexYouHaventPreviouslyUsed"] вернет undefined; ассоциативный массив всегда даст вам undefined для индексов, которые не существуют.

Таким образом, delete myArr[someId] приведет к тому, что myArr будет относиться к someId как к любому другому индексу, который не существует - не так ли вам?