Удаление элементов с помощью Array.map в JavaScript
Вдохновленный написанием data-wrangling этого ответа, я позже расширил client-scripting и написал сообщение в блоге, в ecmascript котором подробно рассказывалось data-wrangling об этом. Я рекомендую checking that out, если client-scripting вы хотите глубже понять, как js думать об этой проблеме - я functional-programming пытаюсь объяснить ее по частям, а data-wrangling также в конце провожу сравнение .js JSperf, не обращая внимания data-wrangling на скорость.
Тем не менее, ** Тл; др js это:
Чтобы выполнить то, о чем вы просите (фильтрация и сопоставление в рамках одного вызова функции), вы должны использовать Array.reduce()
**.
Однако более читабельный и (что менее важно) обычно значительно быстрее 2 подход заключается в просто используйте вместе фильтр и карту:
[1,2,3].filter(num => num > 2).map(num => num * 2)
Далее следует описание functional-programming того, как работает Array.reduce()
и как javascript его можно использовать для client-scripting выполнения фильтрации и сопоставления client-side за одну итерацию. Опять же, если data-wrangling это слишком сжато, я настоятельно ecmascript рекомендую просмотреть сообщение js в блоге, указанное выше, которое javascript является гораздо более дружелюбным functional вступлением с четкими примерами client-side и прогрессом.
Вы даете reduce ecmascript аргумент, который является .js (обычно анонимной) функцией.
Эта анонимная функция принимает js два параметра: один (например, анонимные .js функции, переданные в map javascript-library / filter / forEach) - это data-wrangling итерация, над которой нужно data-wrangling работать. Однако есть еще client-side один аргумент для анонимной data-wrangling функции, переданной для уменьшения, который javascript-library эти функции не принимают, и functional-programming это значение, которое будет передаваться между вызовами функций, часто называемое memo .
Обратите внимание, что data-wrangling в то время как Array.filter() принимает functional только один аргумент (функцию), Array.reduce() также ecmascript принимает важный (хотя и javascript-library необязательный) второй аргумент: начальное functional-programming значение для 'memo', которое ecmascript будет передано этому анонимному data-wrangling function в качестве первого client-side аргумента и впоследствии .js может быть изменен и передан ecmascript между вызовами функций. (Если ecmascript он не указан, то «memo» в functional первом вызове анонимной функции javascript по умолчанию будет первым .js итератором, а аргумент «итерация» будет ecmascript фактически вторым значением data-wrangling в массиве)
В нашем случае ecmascript мы передадим пустой массив javascript-library для запуска, а затем выберем, вставлять javascript ли наш итерационный элемент functional в наш массив или нет, в зависимости functional от нашей функции - это процесс javascript-library фильтрации.
Наконец, мы возвращаем .js наш «массив в процессе выполнения» при client-scripting каждом вызове анонимной функции, а functional-programming reduce примет это возвращаемое ecmascript значение и передаст его в javascript-library качестве аргумента (называемого js памяткой) следующему вызову .js функции.
Это позволяет выполнять ecmascript фильтрацию и отображение js за одну итерацию, сокращая data-manipulation количество требуемых итераций javascript вдвое - просто делая в два .js раза больше работы на каждой functional-programming итерации, поэтому на самом javascript деле ничего не сохраняется, кроме javascript-library вызовов функций, что не так. дорого .js в javascript.
Для более полного functional-programming объяснения обратитесь к документации data-wrangling MDN (или к моему сообщению, указанному ecmascript в начале этого ответа).
Базовый data-wrangling пример вызова Reduce:
let array = [1,2,3];
const initialMemo = [];
array = array.reduce((memo, iteratee) => {
// if condition is our filter
if (iteratee > 1) {
// what happens inside the filter is the map
memo.push(iteratee * 2);
}
// this return value will be passed in as the 'memo' argument
// to the next call of this function, and this function will have
// every element passed into it at some point.
return memo;
}, initialMemo)
console.log(array) // [4,6], equivalent to [(2 * 2), (3 * 2)]
более client-side емкая версия:
[1,2,3].reduce((memo, value) => value > 1 ? memo.concat(value * 2) : memo, [])
Обратите внимание, что functional первая итерация была не больше ecmascript единицы и поэтому была отфильтрована. Также ecmascript обратите внимание на initialMemo, названный js просто для того, чтобы прояснить ecmascript его существование и привлечь client-scripting к нему внимание. И снова ecmascript он передается как «памятка» при data-manipulation первом вызове анонимной функции, а javascript затем возвращаемое значение data-manipulation анонимной функции передается data-wrangling в качестве аргумента «памятка» следующей data-manipulation функции.
Другой пример классического ecmascript варианта использования memo functional - это возврат наименьшего client-scripting или наибольшего числа в массиве. Пример:
[7,4,1,99,57,2,1,100].reduce((memo, val) => memo > val ? memo : val)
// ^this would return the largest number in the list.
Пример ecmascript того, как написать свою собственную .js функцию сокращения (я нахожу data-wrangling это часто помогает понять functional-programming подобные функции):
test_arr = [];
// we accept an anonymous function, and an optional 'initial memo' value.
test_arr.my_reducer = function(reduceFunc, initialMemo) {
// if we did not pass in a second argument, then our first memo value
// will be whatever is in index zero. (Otherwise, it will
// be that second argument.)
const initialMemoIsIndexZero = arguments.length < 2;
// here we use that logic to set the memo value accordingly.
let memo = initialMemoIsIndexZero ? this[0] : initialMemo;
// here we use that same boolean to decide whether the first
// value we pass in as iteratee is either the first or second
// element
const initialIteratee = initialMemoIsIndexZero ? 1 : 0;
for (var i = initialIteratee; i < this.length; i++) {
// memo is either the argument passed in above, or the
// first item in the list. initialIteratee is either the
// first item in the list, or the second item in the list.
memo = reduceFunc(memo, this[i]);
// or, more technically complete, give access to base array
// and index to the reducer as well:
// memo = reduceFunc(memo, this[i], i, this);
}
// after we've compressed the array into a single value,
// we return it.
return memo;
}
Реальная js реализация позволяет получить data-wrangling доступ, например, к таким ecmascript вещам, как индекс, но я надеюсь, что javascript это поможет вам легко понять client-side его суть.
javascript
functional-programming
data-manipulation
client-side
Удаление элементов с помощью Array.map в JavaScript
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.