Удаление элементов с помощью 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

2022-11-16T12:51:18+00:00