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

142

Как удалить ключ bar из массива foo, чтобы bar не отображался в

for(key in foo){alert(key);}
Стивен Ноубл
источник

Ответы:

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']
user3177525
источник
2
Это не массив! Это объект (да, в JS это называется ассоциативными массивами, но нет, на самом деле это не так, и этот метод вреден, если вы действительно работаете с массивом JS).
Wintercounter 07
3

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

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