Как найти сумму массива чисел - PullRequest
618 голосов
/ 05 августа 2009

Учитывая массив [1, 2, 3, 4], как я могу найти сумму его элементов? (В этом случае сумма будет 10.)

Я подумал, $.each может быть полезно, но я не уверен, как это реализовать.

Ответы [ 38 ]

1156 голосов
/ 25 мая 2013

В Lisp , это будет именно та работа для reduce. Вы бы увидели такой код:

(reduce #'+ '(1 2 3)) ; 6

К счастью, в JavaScript у нас также есть reduce! К сожалению, + является оператором, а не функцией. Но мы можем сделать это красиво! Вот, смотрите:

const sum = [1, 2, 3].reduce(add,0); // with initial value to avoid when the array is empty

function add(accumulator, a) {
    return accumulator + a;
}

console.log(sum); // 6

Разве это не красиво? : -)

Еще лучше! Если вы используете ECMAScript 2015 (он же ECMAScript 6 ), это может быть довольно красиво:

const sum = [1, 2, 3].reduce((partial_sum, a) => partial_sum + a,0); 
console.log(sum); // 6
197 голосов
/ 16 января 2012

Почему бы не уменьшить? Обычно это немного противоречит интуиции, но использовать ее для нахождения суммы довольно просто:

var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);
191 голосов
/ 12 апреля 2017

Рекомендуется (уменьшить со значением по умолчанию)

Array.prototype.reduce может использоваться для перебора массива, добавляя текущее значение элемента к сумме предыдущих значений элемента.

console.log(
  [1, 2, 3, 4].reduce((a, b) => a + b, 0)
)
console.log(
  [].reduce((a, b) => a + b, 0)
)

Без значения по умолчанию

Вы получаете ошибку типа.

console.log(
  [].reduce((a, b) => a + b)
)

До функций стрелок ES6

console.log(
  [1,2,3].reduce(function(acc, val) { return acc + val; }, 0)
)

console.log(
  [].reduce(function(acc, val) { return acc + val; }, 0)
)

Нецифровые входы

Если не входящие в число номера являются возможными входами, возможно, вы захотите с этим справиться?

console.log(
  ["hi", 1, 2, "frog"].reduce((a, b) => a + b)
)

let numOr0 = n => isNaN(n) ? 0 : n

console.log(
  ["hi", 1, 2, "frog"].reduce((a, b) => 
    numOr0(a) + numOr0(b))
)

Не рекомендуется Опасно Eval Use

Мы можем использовать eval для выполнения строкового представления кода JavaScript. Используя функцию Array.prototype.join для преобразования массива в строку, мы меняем [1,2,3] на «1 + 2 + 3», что соответствует 6.

console.log(
  eval([1,2,3].join('+'))
)

//This way is dangerous if the array is built
// from user input as it may be exploited eg: 

eval([1,"2;alert('Malicious code!')"].join('+'))

Конечно, отображение предупреждения - не самое страшное, что может случиться. Единственная причина, по которой я включил это, заключается в ответе на вопрос Ортунда, поскольку я не думаю, что он был уточнен.

86 голосов
/ 05 августа 2009
var arr = [1,2,3,4];
var total=0;
for(var i in arr) { total += arr[i]; }
60 голосов
/ 05 августа 2009
var total = 0;
$.each(arr,function() {
    total += this;
});
27 голосов
/ 25 мая 2013

Это возможно путем циклического перебора всех элементов и добавления их на каждой итерации к sum -вариабельной переменной.

var array = [1, 2, 3];

for (var i = 0, sum = 0; i < array.length; sum += array[i++]);

JavaScript не знает область видимости блока, поэтому sum будет доступно:

console.log(sum); // => 6

То же, что и выше, однако с комментариями и подготовкой в ​​виде простой функции:

function sumArray(array) {
  for (
    var
      index = 0,              // The iterator
      length = array.length,  // Cache the array length
      sum = 0;                // The total amount
      index < length;         // The "for"-loop condition
      sum += array[index++]   // Add number on each iteration
  );
  return sum;
}
25 голосов
/ 07 января 2016

Если вы используете Lodash, вы можете использовать sum function

array = [1, 2, 3, 4];
sum = _.sum(array); // sum == 10
23 голосов
/ 13 декабря 2014
arr.reduce(function (a, b) {
    return a + b;
});

Ссылка: Array.prototype.reduce ()

14 голосов
/ 21 октября 2012
// Given array 'arr'
var i = arr.length;
var sum = 0;
while (--i) sum += arr[i];

Это займет в среднем 1,57 мс / прогон (измерено более 1000 прогонов на массиве из 100 случайных нормальных чисел), по сравнению с 3,604 мс / прогон с использованием метода eval(), описанного выше, и 2,151 мс / прогон со стандартным для я, длина, ++) цикл.

Примечание по методологии: этот тест был выполнен на сервере скриптов Google Apps, поэтому их движки JavaScript в значительной степени совпадают с Chrome.

РЕДАКТИРОВАТЬ: --i вместо i-- сохраняет 0,12 мс при каждом запуске (я - 1,7)

РЕДАКТИРОВАТЬ: Святой ругатель, не обращайте внимания на весь этот пост. Используйте упомянутый выше метод redu (), это всего 1 мсек / прогон.

12 голосов
/ 31 декабря 2017

ОК, представьте, что у вас есть этот массив ниже:

const arr = [1, 2, 3, 4];

Давайте начнем изучать множество различных способов сделать это, так как я не смог найти здесь исчерпывающего ответа:

1) Использование встроенного уменьшения ()

function total(arr) {
  if(!Array.isArray(arr)) return;
  return arr.reduce((a, v)=>a + v);
}

2) Использование для цикла

function total(arr) {
  if(!Array.isArray(arr)) return;
  let totalNumber = 0;
  for (let i=0,l=arr.length; i<l; i++) {
     totalNumber+=arr[i];
  }
  return totalNumber;
}

3) Использование цикла while

function total(arr) {
  if(!Array.isArray(arr)) return;
  let totalNumber = 0, i=-1;
  while (++i < arr.length) {
     totalNumber+=arr[i];
  }
  return totalNumber;
}

4) Использование массива forEach

function total(arr) {
  if(!Array.isArray(arr)) return;
  let sum=0;
  arr.forEach(each => {
    sum+=each;
  });
  return sum;
};

и назовите это так:

total(arr); //return 10

Не рекомендуется создавать что-то подобное в Array ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...