Как мне отключить элемент в массиве в javascript?


Ответы:


247

Не используйте delete, поскольку он не удаляет элемент из массива, он только установит его как undefined, что затем не будет правильно отражено в длине массива.

Если вы знаете ключ, вам следует использовать splice, т.е.

myArray.splice(key, 1);

Для кого-то на месте Стивена вы можете попробовать что-то вроде этого:

for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}

или

for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}

3
+1 Хороший замечание, мне тоже нравится этот способ: ejohn.org/blog/javascript-array-remove
Кристиан С. Сальвадо

3
@ThiefMaster - Не хочешь объяснить? Я не знаю, что это значит, и очень хочу научиться. Как всегда, правка в 1 000 000 раз лучше, чем комментарий не из рук; Вы должны знать это, учитывая количество ваших репутации.
будет

21
Используйте for (var key in myArray)вместо for (key in myArray)- в противном случае keyэто глобальная переменная, и если вы вызовете функцию внутри этого цикла, которая имеет ту же проблему, вы получите неожиданные результаты.
ThiefMaster

2
Обратите внимание: второй пример не работает, если в массиве есть несколько элементов в строке, соответствующих 'bar'. Индекс массива сместится, и вы пропустите сращивание половины элементов. Вместо этого используйте цикл for, который уменьшает индекс при обнаружении совпадения.
Дэйв Ланча

Для массива объектов: stackoverflow.com/questions/15287865/…
Федор РЫХТИК

56
delete foo[key];

: D


5
технически это не отвечает на вопрос. он хочет удалить ключевую «планку». и ваша ключевая переменная этого не подразумевает. : P
Кон

4
ключ = 'бар'; eval ("удалить foo." + ключ); прячется ; D
olliej

3
Как НЕ использовать eval. Удаление ключа / индекса объекта / массива может быть достигнуто с помощью гораздо более простых методов, которые не используются eval.
Dinei

4
На самом деле, если вы удалите из индексированного массива, удалив foo [key], он сохранит значение в foo [key] = undefined, а foo.length останется прежним, что неверно. Так что используйте SPLICE вместо
Павел Иванов

использовать delete foo [ключ] неправильно; следует использовать foo.splice (key, 1);
vnguyen

38

Важное замечание: массивы JavaScript не являются ассоциативными массивами, как те, к которым вы, возможно, привыкли в PHP. Если ваш «ключ массива» является строкой, вы больше не работаете с содержимым массива. Ваш массив является объектом, и вы используете скобку для доступа к члену с именем <key name>. Таким образом:

var myArray = [];
myArray ["bar"] = true;
myArray ["foo"] = истина;
предупреждение (myArray.length); // возвращает 0.

поскольку вы не добавляли элементы в массив, вы изменили только элементы bar и foo в myArray.


38

Если вы знаете имя ключа, просто сделайте так:

delete array['key_name']

2
Это не массив! Это объект (да, в JS это называется ассоциативными массивами, но нет, на самом деле это не так, и этот метод вреден, если вы действительно работаете с массивом JS).
Wintercounter 07

3

Вот как бы я это сделал

 myArray.splice( myArray.indexOf('bar') , 1) 

1
Метод Array.prototype.indexOf () ищет значение в массиве, а не ключ. Так что это не сработает.
Nadav

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.