Я ищу эффективный способ удалить все элементы из массива JavaScript, если они присутствуют в другом массиве.
// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// and this one:
var toRemove = ['b', 'c', 'g'];
Я хочу использовать myArray, чтобы оставить его в таком состоянии: ['a', 'd', 'e', 'f']
Я использую jQuery grep()
и inArray()
, который хорошо работает:
myArray = $.grep(myArray, function(value) {
return $.inArray(value, toRemove) < 0;
});
Есть ли чистый способ сделать это без зацикливания и объединения?
javascript
arrays
Нажмите
источник
источник
.filter()
. Вместо этого вы будете использоватьfor
петли. Вы можете избежать,.splice()
если первоначальный заказ не нужно поддерживать. Или есть способы сделать.splice()
более эффективными, если вы думаете, что будет много элементов для удаления.Ответы:
Используйте
Array.filter()
метод:Небольшое улучшение, так как поддержка браузера
Array.includes()
увеличилась:Следующая адаптация с использованием функций стрелок :
источник
.difference()
основном и делает.toRemove()
в верхний регистр и изменение обратного вызова сel
наel.toUpperCase()
.myArray = myArray.filter( el => !toRemove.includes( el ) );
filter
Метод должен сделать трюк:Если ваш
toRemove
массив большой, этот тип поиска может быть неэффективным. Было бы более производительным создать карту, чтобы поиск былO(1)
лучше, чемO(n)
.источник
Если вы используете массив объектов. Тогда приведенный ниже код должен творить чудеса, где свойство объекта будет критерием для удаления дублирующихся элементов.
В приведенном ниже примере были удалены дубликаты, сравнивая названия каждого элемента.
Попробуйте этот пример. http://jsfiddle.net/deepak7641/zLj133rh/
источник
Для этого у Lodash также есть служебная функция: https://lodash.com/docs#difference
источник
Наборы ECMAScript 6 могут использоваться для вычисления различных элементов двух массивов:
источник
Я просто реализовал как:
Использовать как:
источник
prototypes
родные Объекты, такиеArray
. Это может иметь долгосрочный конфликт с будущим развитием языка ( смflatten
случая )Если вы не можете использовать новый ES5,
filter
я думаю, вы застряли с двумя циклами:источник
источник
Теперь в однострочном аромате:
Может не работать на старых браузерах.
источник
Вы можете использовать _.differenceBy из lodash
Пример кода здесь: CodePen
источник
Как насчет самого простого из возможных:
источник
includes
не доступно до ES7.Правильный способ удалить все элементы, содержащиеся в другом массиве, состоит в том, чтобы сделать исходный массив тем же объектом, удалив только элементы:
Или эквивалент CoffeeScript:
Тестирование внутри Chrome Dev Tools:
Использование Angular Framework - лучший способ сохранить указатель на исходный объект при обновлении коллекций без большого количества наблюдателей и перезагрузок.
источник
Я строю логику без использования каких-либо встроенных методов, пожалуйста, дайте мне знать о любой оптимизации или модификациях. Я тестировал в редакторе JS, он работает нормально.
источник