Предположим, у меня есть этот код:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
Теперь, если я хотел удалить «фамилию»? .... есть какой-то эквивалент
myArray["lastname"].remove()
?
(Мне нужно убрать элемент, потому что количество элементов важно, и я хочу, чтобы все было чисто.)
"Test" + {};
, это совершенно правильный оператор JS.Ответы:
Объекты в JavaScript можно рассматривать как ассоциативные массивы, сопоставляющие ключи (свойства) со значениями.
Чтобы удалить свойство из объекта в JavaScript, вы используете
delete
оператор:Обратите внимание, что когда
delete
применяется к свойству index объекта anArray
, вы создаете малонаселенный массив (т. Е. Массив с отсутствующим индексом).При работе с экземплярами
Array
, если вы не хотите создавать малонаселенный массив - а вы обычно этого не делаете - тогда вам следует использоватьArray#splice
илиArray#pop
.Обратите внимание, что
delete
оператор в JavaScript не освобождает память напрямую. Его целью является удаление свойств из объектов. Конечно, если удаляемое свойство содержит единственную оставшуюся ссылку на объектo
, тоo
впоследствии будет выполняться сбор мусора обычным способом.Использование
delete
оператора может повлиять на способность движков JavaScript оптимизировать код .источник
delete myArray[0]
. См. Stackoverflow.com/a/9973592/426379 и Удаление элементов массиваlength
свойство объекта Array остается неизменным.myArray
он действительно использовался в качестве массива - но это не так (myArray
это неудачное имя), это объект. Так что в этом случаеdelete
все в порядке. Обратите внимание, что даже если бы он был создан какnew Array()
и использовался как ассоциативный массив, все равно все было бы в порядке. Тем не менее, ваше предупреждение - это то, о чем нужно знать, если вы используете реальные массивы.Все объекты в JavaScript реализованы в виде хеш-таблиц / ассоциативных массивов. Итак, следующие являются эквивалентными:
И, как уже указывалось, вы «удаляете» свойство из объекта через
delete
ключевое слово, которое вы можете использовать двумя способами:Надеюсь, что дополнительная информация поможет ...
источник
myObj['some;property']
работает, ноmyObj.some;property
не будет (по понятным причинам). Также может быть неочевидно, что вы можете использовать переменную в скобочных обозначениях, то естьvar x = 'SomeProperty'; alert(myObj[x])
Ни в одном из предыдущих ответов не говорится о том факте, что в Javascript нет ассоциативных массивов для начала -
array
типа нет как такового, видитеtypeof
.В Javascript есть экземпляры объектов с динамическими свойствами. Когда свойства перепутаны с элементами экземпляра объекта Array, тогда обязательно произойдут плохие вещи:
проблема
Решение
Чтобы иметь универсальную функцию удаления, которая не взорвет вас, используйте:
источник
Array
объекты в JS являются объектами, попробуйтеtypeof new Array();
илиtypeof []
проверьте.Array
это просто определенный вид объекта, а вовсе не «другой зверь». В JS объекты различаются по имени конструктора и цепочке прототипов, см. Программирование на основе прототипов .delete
имеет операторArray
, предоставляя простую полиморфную функцию.delete
не имеет недостатка.delete
предназначен для удаления свойств. Вот и все. Применение оператора удаления к индексу массива удаляет этот индекс. Что еще нужно сделать? Вы остаетесь с разреженным массивом, который является особенностью языка. Если вам не нужен разреженный массив, не удаляйте индекс: используйтеsplice
илиpop
.Это только удаляет удаляет объект, но по-прежнему сохраняет длину массива той же.
Для удаления нужно сделать что-то вроде:
источник
Хотя принятый ответ является правильным, в нем отсутствует объяснение, почему он работает.
Прежде всего, ваш код должен отражать тот факт, что это НЕ массив:
Обратите внимание, что все объекты (включая
Array
s) могут быть использованы таким образом. Однако не ожидайте, что стандартные функции массива JS (pop, push, ...) будут работать с объектами!Как сказано в принятом ответе, вы можете затем использовать
delete
для удаления записи из объектов:Вы должны решить, какой маршрут вы хотите выбрать - либо использовать объекты (ассоциативные массивы / словари), либо использовать массивы (карты). Никогда не смешивайте их обоих.
источник
Используйте метод,
splice
чтобы полностью удалить элемент из массива объектов:источник
Как уже отмечалось в других ответах, вы используете не массив Javascript, а объект Javascript, который работает почти как ассоциативный массив в других языках, за исключением того, что все ключи преобразуются в строки. Новая карта хранит ключи как их первоначальный тип.
Если у вас есть массив, а не объект, вы можете использовать функцию массива .filter , чтобы вернуть новый массив без элемента, который вы хотите удалить:
Если у вас более старый браузер и jQuery, у jQuery есть
$.grep
метод, который работает аналогично:источник
В Руководстве по стилю Airbnb есть элегантный способ сделать это (ES7):
Авторское право: https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90
источник
Вы используете Object, у вас нет ассоциативного массива для начала. С ассоциативным массивом добавление и удаление элементов происходит следующим образом:
источник
Вы можете удалить запись с вашей карты, явно присвоив ей значение «undefined». Как и в вашем случае:
источник
Если по какой-либо причине ключ удаления не работает (как будто он не работает для меня)
Вы можете склеить его, а затем отфильтровать неопределенные значения
Не пытайтесь объединить их в цепочку, поскольку splice возвращает удаленные элементы;
источник
Мы можем использовать это как функцию тоже. Angular выдает некоторую ошибку, если используется в качестве прототипа. Спасибо @HarpyWar. Это помогло мне решить проблему.
источник
Это очень просто, если у вас есть зависимость underscore.js в вашем проекте -
источник
Используя
"delete"
ключевое слово, он удалит элемент массива из массива в javascript.Например,
Рассмотрим следующие утверждения.
Последняя строка кода удалит элемент массива, ключ которого «status», из массива.
источник
Без зацикливания / повторения мы получаем тот же результат
источник
Для "Массивов":
Если вы знаете индекс:
Если вы знаете значение:
Ответ с наибольшим количеством голосов
delete
хорошо подходит для объектов, но не для реальных массивов. Если я используюdelete
это, удаляет элементы из циклов, но сохраняет элемент какempty
и длина массива не изменится. Это может быть проблемой в некоторых сценариях.Например, если я выполняю myArray.toString () на myArray после удаления через
delete
него, создается пустая запись, т.е.источник
Единственный метод работы для меня:
Применение:
источник