Сегодня позвольте мне подробно представить этот метод, надеюсь, он будет вам полезен. Это основное использование сокращения: Редукция — это метод объекта-прототипа массива, который помогает нам работать с массивами. В качестве аргумента он принимает другую функцию, которую можно назвать редуктором. редуктор принимает два параметра. Первый параметр param1 является результатом последнего запуска редуктора. Если редуктор запускается впервые, значением параметра param1 по умолчанию является значение первого элемента массива. Метод сокращения проходит по каждому элементу массива, как в цикле for. И передайте текущее значение в цикле в качестве параметра 2. После обхода массива сокращение вернет результат, вычисленный последним редуктором. Давайте рассмотрим подробный пример. Далее давайте рассмотрим, как выполняется приведенный выше код. В этом коде добавлен редуктор. Во-первых, поскольку мы выполняем add впервые, первый элемент «a» в массиве будет рассматриваться как первый параметр add, а затем цикл начнется со второго элемента «b» массива. На этот раз «b» — это второй добавляемый аргумент. После первого расчета мы получаем результат «ab». Этот результат будет кэширован и использован в качестве параметра 1 в следующем расчете сложения. В то же время третий параметр «c» в массиве будет использоваться как параметр2 add. Аналогично, сокращение продолжается по всем элементам массива, используя «abc» и «d» в качестве аргументов для добавления. Наконец, после прохождения последнего элемента массива возвращается результат вычисления. Теперь у нас есть результат: «abcde». Итак, мы видим, что сокращение — это еще и способ перемещения по массиву! Он по очереди принимает значение каждого элемента массива и выполняет функцию редуктора. Но мы видим, что приведенный выше цикл не обладает такой гармоничной красотой. Потому что мы берем первый элемент массива, то есть «a», в качестве начального параметра1, а затем перебираем второй элемент массива, чтобы получить параметр2. Фактически, мы можем указать второй параметр в сокращении как начальное значение параметра param1 функции редуктора, так что параметр param2 будет получен в цикле, начиная с первого элемента массива. Код выглядит следующим образом: На этот раз мы сначала вызываем редуктор с параметром «s» в качестве параметра1, а затем проходим по массиву, начиная с первого элемента. Итак, мы можем переписать наш первый фрагмент кода, используя этот синтаксис. Далее мы перейдем к настоящей главе программирования, чтобы ощутить мощную силу сокращения. Что бы вы сделали, если бы мы хотели получить сумму всех элементов массива? Вообще говоря, вы можете написать что-то вроде этого: Конечно, у вас могут быть другие способы написания, но пока вы используете цикл for, код станет избыточным. Затем давайте посмотрим, что делает приведенная выше функция накопления: Установить начальную сумму на ноль Получить первый элемент массива и просуммировать его Кэшируйте результат предыдущего шага в сумме По очереди вынимайте другие элементы массива и выполните указанные выше операции. вернуть окончательный результат Мы видим, что когда мы описываем вышеуказанные шаги словами, становится очевидно, что это соответствует использованию сокращения. Итак, мы можем переписать приведенный выше код, используя сокращение: Если вы привыкли использовать стрелочные функции, приведенный выше код будет выглядеть чище: Одна строка кода и готово! Конечно, кумулятивное умножение и накопление абсолютно одинаковы: Часто при суммировании нам приходится добавлять вес, который лучше отражает элегантность сокращения. Если вы хотите получить максимальное и минимальное значения массива, вы можете написать: Это то же самое, что и раньше: если мы используем сокращение, мы можем сделать это в одной строке кода. Нам часто необходимо подсчитать количество вхождений каждого элемента в массив. Метод сокращения помогает нам добиться этого. Обратите внимание, что мы используем объекты карты вместо объектов для хранения статистических частот, поскольку элементы в массиве могут иметь тип объекта, а ключи объектов могут быть только строковыми или символьными типами. Вот два примера: Аналогично, если вы хотите подсчитать частоту каждого символа в строке, вы можете сначала преобразовать строку в массив символов, а затем следовать описанному выше методу. Поскольку типы символов могут использоваться в качестве ключей для объектов, мы не будем здесь использовать карту. Доступ к каждому элементу массива осуществляется последовательно через сокращение. Если мы обнаружим, что элемент по-прежнему является массивом, мы рекурсивно вызываем плоский метод. Предисловие
вар обр = [1, 2, 3];
функция редуктор(parmar1, parmar2){
}
arr.reduce(редуктор)
var arr = ['a', 'b', 'c', 'd', 'e'];
функция add(x, y) {
вернуть х + у;
}
arr.reduce(добавить)
var arr = ['a', 'b', 'c', 'd', 'e'];
функция add(x, y) {
вернуть х + у;
}
arr.reduce(добавить, 's')
var arr = ['a', 'b', 'c', 'd', 'e'];
функция add(x, y) {
вернуть х + у;
}
arr.reduce(добавить, '')
1. Накопление и накопительное умножение
функция накопления(прибыль) {
пусть сумма = 0;
for (пусть я = 0; я <arr.length; i++) {
сумма = сумма + arr[i];
}
сумма возврата;
}
функция накопления(прибыль) {
функция редуктор(x, y) {
вернуть х + у
}
вернуть arr.reduce(редуктор, 0);
}
функция накопления(прибыль) {
return arr.reduce((x, y) => x + y, 0);
}
функция умножения (прибл.) {
return arr.reduce((x, y) => x * y, 1);
}
константные баллы = [
{ балл: 90, тема: "HTML", вес: 0,2 },
{ балл: 95, тема: "CSS", вес: 0,3 },
{ балл: 85, тема: "JavaScript", вес: 0.5 }
];
const result = Scores.reduce((x, y) => x + y.score * y.weight, 0 // 89);
2. Получить максимальное и минимальное значения массива
функция max(arr){
пусть макс = arr[0];
for (let ele of arr) {
если (еле > макс) {
Макс = Эле;
}
}
возврат макс;
}
пусть arr = [3,24, 2,78, 999];
arr.reduce((x, y) => Math.max(x, y));
arr.reduce((x, y) => Math.min(x, y));
3. Вычислить частоту появления элементов в массиве
функция countFrequency(arr) {
return arr.reduce(function(result, ele){
// Оцениваем, был ли этот элемент учтен ранее
если (result.get(ele) != не определено) {
/**
* Если этот элемент уже был учтен ранее,
* увеличить частоту его появления на 1
*/
result.set(ele, result.get(ele) + 1)
} еще {
/**
* Если этот элемент ранее не учитывался,
* установите частоту его появления на 1
*/
result.set(еле, 1);
}
вернуть результат;
}, новая карта());
}
пусть str = 'helloworld';
str.split('').reduce((result, currentChar) => {
результат[currentChar] ? результат[currentChar] ++: результат[currentChar] = 1;
вернуть результат;
}, {})
4. Сведение нескольких массивов
функция Flat(arr = []) {
return arr.reduce((t, v) => t.concat(Array.isArray(v) ? Flat(v): v), [])
}