Если у меня есть ассоциативный массив JS, который из того, что я собираю, действительно является объектом, и я хочу удалить элемент, использование delete myArr[someId]
установит элемент в undefined, в то время как сращивание не будет работать вообще... так что альтернатива для ассоциативного массива, если я хочу удалить элемент (а не установить его на undefined
)
Удалить vs сплайсинг на ассоциативном массиве
Ответ 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
как к любому другому индексу, который не существует - не так ли вам?