Как сложить все элементы массива js
Можно использовать обычный цикл, но есть более красивое решение. Метод reduce() , принимает в качестве аргумента массив и колбек функцию, которая применяется к каждому элементу массива и таким образом позволяет найти их сумму. Вот пример:
const numbers = [1, 2, 3, 4]; const sumOfNumbers = numbers.reduce((acc, number) => acc + number, 0); console.log(sumOfNumbers); // => 10
27 октября 2022
Немного улучшу reduce .
acc + number);
А за такое использование map могут и побить. Если уж и хочется из цикла что-то менять снаружи (что почти всегда плохая идея), то для этого используют forEach . Map возвращает значение, которое должно быть использовано. И map не должен менять ничего извне. Иначе код становится сложноподдерживаемым.
19 октября 2022
Помимо стандартного перебора значений и красивого метода reduce(), можно воспользоваться функцией высшего порядка map:
const numbers = [1, 2, 3]; let sum = 0; numbers.map((item) => sum += item); console.log(sum); // => 6
И для любителей библиотеки Lodash доступен метод _.sum():
const numbers = [1, 2, 3]; console.log(_.sum(numbers)); // => 6
Array.prototype.reduce()
Метод reduce() применяет функцию reducer к каждому элементу массива (слева-направо), возвращая одно результирующее значение.
Интерактивный пример
Синтаксис
array.reduce(callback[, initialValue])
Параметры
Функция, выполняющаяся для каждого элемента массива, принимает четыре аргумента:
Аккумулятор, аккумулирующий значение, которое возвращает функция callback после посещения очередного элемента, либо значение initialValue , если оно предоставлено (смотрите пояснения ниже).
Текущий обрабатываемый элемент массива.
Индекс текущего обрабатываемого элемента массива.
Массив, для которого была вызвана функция reduce .
Необязательный параметр. Объект, используемый в качестве первого аргумента при первом вызове функции callback .
Описание
Метод reduce() выполняет функцию callback один раз для каждого элемента, присутствующего в массиве, за исключением пустот, принимая четыре аргумента: начальное значение (или значение от предыдущего вызова callback ), значение текущего элемента, текущий индекс и массив, по которому происходит итерация.
При первом вызове функции, параметры accumulator и currentValue могут принимать одно из двух значений. Если при вызове reduce() передан аргумент initialValue , то значение accumulator будет равным значению initialValue , а значение currentValue будет равным первому значению в массиве. Если аргумент initialValue не задан, то значение accumulator будет равным первому значению в массиве, а значение currentValue будет равным второму значению в массиве.
Если массив пустой и аргумент initialValue не указан, будет брошено исключение TypeError . Если массив состоит только из одного элемента (независимо от его положения в массиве) и аргумент initialValue не указан, или если аргумент initialValue указан, но массив пустой, то будет возвращено одно это значение, без вызова функции callback .
Предположим, что reduce() используется следующим образом:
[0, 1, 2, 3, 4].reduce(function (previousValue, currentValue, index, array) return previousValue + currentValue; >);
Колбэк-функция будет вызвана четыре раза, аргументы и возвращаемое значение при каждом вызове будут следующими:
| previousValue | currentValue | index | array | возвращаемое значение | |
|---|---|---|---|---|---|
| первый вызов | 0 | 1 | 1 | [0, 1, 2, 3, 4] | 1 |
| второй вызов | 1 | 2 | 2 | [0, 1, 2, 3, 4] | 3 |
| третий вызов | 3 | 3 | 3 | [0, 1, 2, 3, 4] | 6 |
| четвёртый вызов | 6 | 4 | 4 | [0, 1, 2, 3, 4] | 10 |
Значение, возвращённое методом reduce() будет равным последнему результату выполнения колбэк-функции — 10 .
Если же вы зададите начальное значение initialValue , результат будет выглядеть так:
[0, 1, 2, 3, 4].reduce(function (accumulator, currentValue, index, array) return accumulator + currentValue; >, 10);
| accumulator | currentValue | index | array | возвращаемое значение | |
|---|---|---|---|---|---|
| первый вызов | 10 | 0 | 0 | [0, 1, 2, 3, 4] | 10 |
| второй вызов | 10 | 1 | 1 | [0, 1, 2, 3, 4] | 11 |
| третий вызов | 11 | 2 | 2 | [0, 1, 2, 3, 4] | 13 |
| четвёртый вызов | 13 | 3 | 3 | [0, 1, 2, 3, 4] | 16 |
| пятый вызов | 16 | 4 | 4 | [0, 1, 2, 3, 4] | 20 |
Значение, возвращённое методом reduce() на этот раз, конечно же, будет равным 20 .
Примеры
Суммирование всех значений в массиве
var total = [0, 1, 2, 3].reduce(function (a, b) return a + b; >); // total == 6
Суммирование значений в массиве объектов
Чтобы суммировать значения, содержащиеся в массиве объектов, вы должны указать initialValue , чтобы каждый элемент смог пройти через callback .
var initialValue = 0; var sum = [ x: 1 >, x: 2 >, x: 3 >].reduce(function ( accumulator, currentValue, ) return accumulator + currentValue.x; >, initialValue); // sum == 6
Тоже самое, но со стрелочной функцией:
var initialValue = 0; var sum = [ x: 1 >, x: 2 >, x: 3 >].reduce( (accumulator, currentValue) => accumulator + currentValue.x, initialValue, ); // sum == 6
Разворачивание массива массивов
var flattened = [ [0, 1], [2, 3], [4, 5], ].reduce(function (a, b) return a.concat(b); >); // flattened равен [0, 1, 2, 3, 4, 5]
Пример: склеивание массивов, содержащихся в объектах массива, с использованием оператора расширения и initialValue
// friends - список из объектов(друзей) // где поле "books" - список любимых книг друга var friends = [ name: "Anna", books: ["Bible", "Harry Potter"], age: 21 >, name: "Bob", books: ["War and peace", "Romeo and Juliet"], age: 26 >, name: "Alice", books: ["The Lord of the Rings", "The Shining"], age: 18 >, ]; // allbooks - список, который будет содержать все книги друзей + // дополнительный список указанный в initialValue var allbooks = friends.reduce( function (prev, curr) return [. prev, . curr.books]; >, ["Alphabet"], ); // allbooks = ["Alphabet", "Bible", "Harry Potter", "War and peace", // "Romeo and Juliet", "The Lord of the Rings", "The Shining"]
Полифил
Метод Array.prototype.reduce() был добавлен к стандарту ECMA-262 в 5-м издании; поэтому он может отсутствовать в других реализациях стандарта. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать reduce() в реализациях, которые не поддерживают этот метод.
// Шаги алгоритма ECMA-262, 5-е издание, 15.4.4.21 // Ссылка (en): http://es5.github.io/#x15.4.4.21 // Ссылка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.21 if (!Array.prototype.reduce) Array.prototype.reduce = function (callback /*, initialValue*/) "use strict"; if (this == null) throw new TypeError("Array.prototype.reduce called on null or undefined"); > if (typeof callback !== "function") throw new TypeError(callback + " is not a function"); > var t = Object(this), len = t.length >>> 0, k = 0, value; if (arguments.length >= 2) value = arguments[1]; > else while (k len && !(k in t)) k++; > if (k >= len) throw new TypeError("Reduce of empty array with no initial value"); > value = t[k++]; > for (; k len; k++) if (k in t) value = callback(value, t[k], k, t); > > return value; >; >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-array.prototype.reduce |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Хочу сложить элементы массива, так , как это делалось бы в столбик на бумаге
Есть три массива : в первый ввожу число ,например, 12345, во второй ввожу число 22222 , соответственно в третий массив записываю результат сложения этих двух чисел, так , как будто бы это было посчитано на бумажке(ну сложение в столбик) Вот код:(ошибка в нем есть, конечно же)
#define _CRT_SECURE_NO_WARNINGS #include #include void main(void) < int A[5], B[5], C[10], i = 0, j = 0, k = 10; for (i = 0; i < 5; i++) < A[i] = getchar(); >for (i = 0; i < 5; i++) < B[i] = getchar(); >for (i = 4; i >= 0; i--) < for (j = 4; j for (i = 0; i _getch(); >
Вот еще один вопрос: насколько целесообразно вводить посимвольно цифры числа через getchar() , просто иначе придется постоянно нажимать Enter после ввода каждой цифры.И можно ли хранить знак минус в интовом массиве ,
Отслеживать
задан 29 ноя 2017 в 18:38
1,790 1 1 золотой знак 21 21 серебряный знак 37 37 бронзовых знаков
Для начала, обнулите массивы, вводите . = getchar() — ‘0’; (получите бинарное представление десятичных цифр), обязательно проверяйте и если получили неправильное число, переходите к следующему шагу. А при сложении учитывайте перенос в старший разряд. И кстати, вложенные циклы при сложении — это ошибка.
Метод 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 ,
выполняющие проверку массива