var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}] // all that should remain
Как удалить объект из массива путем сопоставления свойства объекта?
Только родной JavaScript, пожалуйста.
У меня возникли проблемы с использованием сплайсинга, так как длина уменьшается с каждым удалением. Использование клонирования и сплайсинга по оригинальному индексу все еще оставляет проблему уменьшения длины.
javascript
Дэн Канзе
источник
источник
Ответы:
Я полагаю, вы использовали
splice
что-то вроде этого?Все, что вам нужно сделать, чтобы исправить ошибку, это уменьшить значение
i
в следующий раз, а затем (и возврат в обратном направлении также возможен):Чтобы избежать линейного удаления, вы можете записать элементы массива, которые хотите сохранить над массивом:
и чтобы избежать поиска по линейному времени в современной среде выполнения, вы можете использовать хэш-набор:
который можно обернуть в хорошую функцию:
Если вам не нужно делать это на месте, это
Array#filter
:источник
Вы можете удалить элемент по одному из его свойств без использования сторонних библиотек:
источник
С lodash / подчеркиванием:
Если вы хотите изменить сам существующий массив, тогда мы должны использовать соединение . Вот немного лучше / читабельный способ с использованием findWhere подчеркивания / lodash:
С ES5 или выше
( без подчеркивания / подчеркивания )
С ES5 и далее у нас есть
findIndex
метод для массива, так что его легко без lodash / underscore(ES5 поддерживается почти во всех современных браузерах)
О findIndex и его совместимости с браузерами
источник
items.splice(items.findIndex(i => i.id === "abc"), 1)
findIndex работает для современных браузеров:
источник
Удалить объект по его идентификатору в данном массиве;
источник
Если вы просто хотите удалить его из существующего массива, а не создавать новый, попробуйте:
источник
Цикл в обратном порядке путем уменьшения,
i
чтобы избежать проблемы:Или используйте
filter
:источник
Проверьте это, используя Set и ES6 filter.
Вот JsFiddle: https://jsfiddle.net/jsq0a0p1/1/
источник
В качестве альтернативы, более «функционального» решения, работающего на ECMAScript 5, вы можете использовать:
Согласно определению «Array.prototype.reduceRight» в ECMA-262 :
Так что это правильное использование
reduceRight
.источник
согласно вашему ответу будет так. когда вы щелкаете какой-то конкретный объект, отправляете индекс в параметре для функции delete me. Этот простой код будет работать как шарм.
источник
с фильтром и indexOf
с фильтром и включает в себя
источник
Если вам нравятся короткие и информативные параметры, или если вы не хотите использовать
splice
и использовать прямой фильтр, или если вы просто человек SQL, как я:И пример использования:
источник
Вы можете использовать
filter
. Этот метод всегда возвращает элемент, если условие истинно. Поэтому, если вы хотите удалить по идентификатору, вы должны сохранить все элементы, которые не соответствуют данному идентификатору. Вот пример:источник