Как я могу пропустить элемент массива в .map
?
Мой код:
var sources = images.map(function (img) {
if(img.src.split('.').pop() === "json"){ // if extension is .json
return null; // skip
}
else{
return img.src;
}
});
Это вернет:
["img.png", null, "img.png"]
javascript
Ismail
источник
источник
img.src
если результат разделения pop! = = JSON?undefined
будет помещен в массив, а неnull
. Не так уж и лучше ...Ответы:
Просто
.filter()
сначала:Если вы не хотите этого делать, что не является необоснованным, поскольку имеет определенную стоимость, вы можете использовать более общее
.reduce()
. Как правило, вы можете выразить.map()
в терминах.reduce
:можно записать как
Поэтому, если вам нужно пропустить элементы, вы можете легко это сделать с помощью
.reduce()
:В этой версии код
.filter()
из первого примера является частью.reduce()
обратного вызова. Источник изображения помещается в массив результатов только в том случае, если операция фильтра сохранила бы его.источник
.reduce()
и делать все это за один проход, хотя в плане производительности я сомневаюсь, что это будет иметь существенное значение.null
,undefined
иNaN
т. Д.) Было бы хорошо, если бы мы могли использовать единицуmap()
в качестве индикатора того, что этот объект ничего не отображает и его следует пропустить. Я часто сталкиваюсь с массивами, которые я хочу отобразить на 98% (например,String.split()
оставляя одну пустую строку в конце, которая меня не волнует). Спасибо за ваш ответ :).reduce()
- это своего рода базовая функция «делай что хочешь», потому что у тебя есть полный контроль над возвращаемым значением. Возможно, вас заинтересует отличная работа Rich Hickey в Clojure, касающаяся концепции преобразователей ..map()
. Однако вы можете использовать.reduce()
вместо этого, поэтому я добавлю это.Я думаю, что самый простой способ пропустить некоторые элементы из массива - использовать метод filter () .
Используя этот метод ( ES5 ) и синтаксис ES6, вы можете написать свой код в одну строку , и это вернет то, что вы хотите :
источник
.filter()
было сделано дляforEach
завершить его за один проход вместо двух?O(n)
сложно измерить, и, пожалуйста, посмотрите хотя бы на эти две статьи: frontendcollisionblog.com/javascript/2015/08/15/… и coderwall.com/p/kvzbpa/don-t- use-array-foreach-use-for-Вместо всего наилучшего!С 2019 года Array.prototype.flatMap является хорошим вариантом.
От MDN :
источник
TLDR: вы можете сначала отфильтровать массив, а затем выполнить карту, но для этого потребуется два прохода в массиве (фильтр возвращает массив в карту). Поскольку этот массив небольшой, это очень низкая стоимость производительности. Вы также можете сделать простое сокращение. Однако, если вы хотите переосмыслить, как это можно сделать за один проход по массиву (или любому другому типу данных), вы можете использовать идею под названием «преобразователи», ставшую популярной благодаря Ричу Хикки.
Ответ:
Мы не должны требовать увеличения цепочки точек и работы с массивом,
[].map(fn1).filter(f2)...
так как этот подход создает промежуточные массивы в памяти на каждомreducing
функции.Наилучший подход основан на действительной функции сокращения, поэтому существует только один проход данных и никаких дополнительных массивов.
Редукционная функция - это функция, передаваемая
reduce
и получающая аккумулятор и входные данные от источника и возвращающая нечто, похожее на аккумуляторРесурсы: богатый пост преобразователей хикки
источник
Вот забавное решение:
Используйте с оператором связывания :
источник
map
,filter
иconcat
звонки.Ответьте без лишних краевых случаев:
источник
Почему бы просто не использовать цикл forEach?
Или еще проще использовать фильтр:
источник
map
позволяет сохранить его таким, как сейчас. (4 года назад я задавал этот вопрос, когда ничего не знал о кодировании).filter(Boolean)
Отфильтрует любые значения falsey в данном массиве, который в вашем случае являетсяnull
.источник
Вот вспомогательный метод (совместимый с ES5), который отображает только ненулевые значения (скрывает призыв к сокращению):
источник
Я использую,
.forEach
чтобы перебрать и передать результат вresults
массив, а затем использовать его, с этим решением я не буду перебирать массив дваждыисточник
Чтобы экстраполировать комментарий Феликса Клинга , вы можете использовать
.filter()
так:Это удалит ложные значения из массива, который возвращается
.map()
Вы могли бы упростить это далее так:
Или даже в виде однострочника с использованием функции стрелки, деструктуризации объекта и
&&
оператора:источник
Вот обновленная версия кода, предоставленного @theprtk . Это немного исправлено, чтобы показать обобщенную версию, имея пример.
Примечание: я бы добавил это как комментарий к своему посту, но у меня пока недостаточно репутации
источник
Вы можете использовать после вас метод
map()
. Методfilter()
например в вашем случае:Метод фильтра:
Тогда только существующие элементы находятся в новом массиве
sourceFiltered
.источник