Метод reduce
Метод reduce сворачивает массив к одному значению (редуцирует). К примеру, с помощью этого метода можно легко найти сумму элементов массива (то есть массив сведется к одному значению — к сумме элементов).
Первым параметром метод reduce получает функцию, которая последовательно выполнится для каждого элемента массива, начиная с первого. В эту функцию можно передавать 4 параметра. Если эти параметры есть (они не обязательны), то в первый автоматически попадет , во второй попадет элемент массива, в третий — его номер в массиве (индекс), а в четвертый — сам массив.
Промежуточный результат — это переменная, в которой будет накапливаться то значение, которое вернет метод reduce , когда переберет все элементы массива. К примеру, туда последовательно можно накапливать сумму элементов массива: сначала положить первый элемент, при следующем проходе цикла уже сумму первого элемента и второго, при следующем проходе — сумму первого, второго и третьего. И так, пока массив не закончится. Функция, которую принимает reduce , должна возвращать новое значение промежуточного результата.
Вторым параметром метода reduce указывается начальное значение промежуточного результата. Если его не указать, то оно будет равно первому элементу массива, а обработка элементов начнется со второго элемента.
Синтаксис
массив.reduce(function(промежуточный результат, элемент, индекс, массив) < return новый промежуточный результат; >, начальное значение);
Пример
Найдем сумму элементов массива:
let arr = [1, 2, 3, 4, 5, 6]; let res = arr.reduce(function(sum, elem) < return sum + elem; >, 0); console.log(res);
Результат выполнения кода:
Пример
Давайте найдем сумму всех положительных чисел массива:
let arr = [1, -2, -3, 4, 5, -6]; let res = arr.reduce(function(sum, elem) < if (elem >= 0) < return sum + elem; >else < return sum; >>); console.log(res);
Результат выполнения кода:
Смотрите также
- метод reduceRight ,
выполняющий похожую операцию - метод filter ,
который позволяет фильтровать элементы массива - методы map и forEach ,
которые позволяют применить функцию к каждому элементу массива - методы some и every ,
выполняющие проверку массива
Сложить элементы в массиве JavaScript?
Я не понимаю, здесь подразумевалось что можно править код функции или ее нужно вызвать как-то хитро? К тому же у нее нет return. Как с ней обращаться?
- Вопрос задан более трёх лет назад
- 7625 просмотров
Комментировать
Решения вопроса 1
Frontend Developer
Надо хитрым образом подсчитать, а на счет правки, скорее всего это ошибка автора данного сайта
var list = [1, 2, 3, 4, 5, 6]; function sum() < var sum = 0; for (i=0; ireturn sum > sum.apply(null, list) // output => 21
Ответ написан более трёх лет назад
Всё только о JavaScript
Иногда необходимо объединить несколько массивов в один, содержащий элементы из исходных массивов. Для этого в JavaScript есть метод concat . Он создаёт копию исходного массива, добавляя к нему переданные аргументы, подобно методу push . Однако, в отличие от push , если методу concat передан другой массив, то будут добавлены элементы этого массива, а не сам массив единственным элементом.
Array.prototype.toString = function() < return '[' + this.join(', ') + ']'; >; var a = [1, 2, 3]; alert(a.concat(4, 5, 6)); // [1, 2, 3, 4, 5, 6] alert(a.concat([4, 5], [6])); // [1, 2, 3, 4, 5, 6]
Однако дальше одного уровня concat аргументы-массивы не разворачивает.
Array.prototype.toString = function() < return '[' + this.join(', ') + ']'; >; var a = [1, 2, 3]; alert(a.concat([4, [5], 6])); // [1, 2, 3, 4, [5], 6]
С разреженными массивами ситуация обстоит ожидаемая: пропуски как из исходного массива, так и из массивов-аргументов, сохраняются.
Array.prototype.toString = function() < return '[' + this.join(', ') + ']'; >; var a = [1, , 3]; alert(a.concat([4, , 6])); // [1, , 3, 4, , 6]
Деление массива
Метод slice имеет сигнатуру slice(begin[, end]) и возвращает подмассив исходного массива, начиная с индекса begin и заканчивая индексом end — 1 . Чтобы легче запомнить такую странную нумерацию, лучше считать, что передаются индексы не элементов, а «межэлементного пространства».
Индексы элементов: 0 1 2 3 4 5 6 7 8 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | Индексы для slice: 0 1 2 3 4 5 6 7 8 9
Тогда становится понятно, что ar.slice(0, 1) вернёт только нулевой элемент, а slice(5, 9) — с пятого по восьмой элементы.
var a = [0, 1, 2, 3, 4, 5]; alert(a.slice(0, 2)); // 0,1 alert(a.slice(4, 5)); // 4
Если второй аргумент является отрицательным числом, то отсчёт второго индекса идёт с конца массива.
var a = [0, 1, 2, 3, 4, 5]; alert(a.slice(0, -2)); // 0,1,2,3
Если же второй аргумент не передан вообще, то возвращается копия массива от begin до конца.
var a = [0, 1, 2, 3, 4, 5]; alert(a.slice(3)); // 3,4,5
Клонирование массива
В JavaScript нет нативного метода для клонирования массивов, однако его легко сэмулировать, помня, что concat и slice не меняют исходный массив. Достаточно вызвать метод concat без аргументов или метод slice с единственным аргументом равным 0 .
var a = [1, 2, 3]; var b = a.concat(); var c = a.slice(0); alert(a + ' ; ' + b + ' ; ' + c); // 1,2,3 ; 1,2,3 ; 1,2,3 alert([a == b, a == c, b == c]); // false,false,false
Обратите внимание, если в массиве лежат ссылки на объекты, в том числе ссылки на другие массивы, то в новосозданном массиве будут лежать ссылки на те же самые объекты. Поэтому если вы хотите клонировать многомерный массив, то придётся вручную создавать новый массив, после чего перебрать подмассивы исходного массива и клонировать их в новый.
// Клонируется только массив верхнего уровня var a = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; var b = a.concat(); alert(a[0][1]); // 2 alert(b[0][1]); // 2 b[0][1] = 15; alert(a[0][1]); // 15 // Клонируем вложенные массивы var a = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; var b = []; a.forEach(function(subArray) < b.push(subArray.concat()); >); alert(a[0][1]); // 2 alert(b[0][1]); // 2 b[0][1] = 15; alert(a[0][1]); // 2
Вычислить сумму всех значений массива в JavaScript
В этом посте будет обсуждаться, как вычислить сумму всех значений массива в JavaScript.
1. Использование Array.reduce() функция
The Array.reduce() Функция в Java используется для вызова функции сокращения для каждого элемента массива и накопления результатов в одном значении. Мы можем вычислить сумму всех значений массива, используя функцию редуктора, которая добавляет значение текущего элемента к уже вычисленной сумме предыдущих значений. Это показано ниже с использованием анонимной функции:
