Учитывая массив [1, 2, 3, 4]
, как я могу найти сумму его элементов? (В этом случае сумма будет 10
.)
Я подумал, что это $.each
может быть полезно, но я не уверен, как это реализовать.
javascript
jquery
arrays
akano1
источник
источник
a[0] + a[1] + ...
, что может превратиться в конкатенацию строк, если массив содержит нечисловые элементы. Например['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
.[1,2,3].reduce(Math.sum)
.Ответы:
Рекомендуется (уменьшить со значением по умолчанию)
Array.prototype.reduce может использоваться для перебора массива, добавляя текущее значение элемента к сумме предыдущих значений элемента.
Без значения по умолчанию
Вы получаете TypeError
До функций стрелок ES6
Нечисловые входы
Если не-числа являются возможными входами, вы можете с этим справиться?
Не рекомендуемое опасное использование
Мы можем использовать eval для выполнения строкового представления кода JavaScript. Используя функцию Array.prototype.join для преобразования массива в строку, мы меняем [1,2,3] на «1 + 2 + 3», что соответствует 6.
Конечно, отображение предупреждения - не самое страшное, что может случиться. Единственная причина, по которой я это включил, это ответ Ортунда на вопрос, так как я не думаю, что он был прояснен.
источник
reduce()
все еще на 25-30% медленнее, чем простой индексированныйfor()
цикл после долгих лет? jsperf.com/reduce-vs-loop/4В Лиспе это было бы именно работой для
reduce
. Вы бы увидели такой код:К счастью, в JavaScript у нас тоже есть
reduce
! К сожалению,+
это оператор, а не функция. Но мы можем сделать это красиво! Вот, посмотрите:Разве это не красиво? :-)
Даже лучше! Если вы используете ECMAScript 2015 (он же ECMAScript 6 ), это может быть довольно красиво:
источник
[1, 2, 3].reduce((a,b)=>a+b)
Array.prototype.sum = function() { return this.reduce((a,b) => a+b, 0); }
Array.prototype.avg = function() { return this.reduce((a,b) => a+b, 0)/this.length; }
Почему бы не уменьшить? Обычно это немного противоречит интуиции, но использовать ее для нахождения суммы довольно просто:
источник
reduce()
?Array.prototype.reduce()
уменьшает массив до одного возвращаемого значения.источник
(var i=0; i<arr.length; i++)
еще быстрее. И даже тогда использованиеvar sum=0; var i=arr.length; while(i--) sum += arr[i]
еще быстрее.for... in
циклов в массивах работает в этом случае _ по совпадению_ и потому, что массивы расширяют объекты. Решение Рикинга лучшеfor...in
Цикл в JavaScript имеет индексы, что является общим камнем преткновения для кодеров , которые ожидают получить значения. (Попробуйтеfor(var i in [1,2,3]) { console.log(i); }
в консоли.)источник
reduce
ниже; не объявляйте изменяемые переменные, когда у вас их тоже нет.Если вы используете Lodash, вы можете использовать функцию суммы
источник
Это возможно путем циклического
sum
перебора всех элементов и добавления их на каждой итерации в переменную -var.JavaScript не знает блоковую область видимости, поэтому
sum
будет доступен:То же, что и выше, однако аннотировано и подготовлено в виде простой функции:
источник
sum
вне цикла, гораздо более читабельным.const
иlet
. Таким образом, вы можете объявитьsum
внеfor
цикла какlet sum = 0;
. Вы также можете кэшировать длину массива перед циклом какconst length = array.length;
Ссылка: Array.prototype.reduce ()
источник
arr
есть[]
.arr.reduce(function (a, b) { return a + b; }, 0);
Это займет в среднем 1,57 мс / прогон (измерено более 1000 прогонов на массиве из 100 случайных нормальных чисел), по сравнению с 3,604 мс / прогон с
eval()
описанным выше способом и 2,151 мс / прогон со стандартом для (i, length, ++) ) петля.Примечание по методологии: этот тест был запущен на сервере скриптов Google Apps, поэтому его движки JavaScript в значительной степени совпадают с Chrome.
РЕДАКТИРОВАТЬ:
--i
вместоi--
сохранения 0,12 мс каждый прогон (я-- 1,7)РЕДАКТИРОВАТЬ: Святой ругань, не берите в голову весь этот пост. Используйте метод redu (), упомянутый выше, это всего 1 мсек / прогон.
источник
while (--i) do_something
может работать и для других вещей.var sum = arr[0]
Вы также можете использовать ReduRight.
что приводит к выводу как 21.
Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
источник
Кто-нибудь ищет функционального лайнера, как я? Возьми это:
источник
arr.reduce(function(a, b) { return a + b;}, 0);
Хорошо, представьте, что у вас есть этот массив ниже:
Давайте начнем искать много разных способов сделать это, так как я не смог найти здесь исчерпывающего ответа:
1) Использование встроенного метода limit ()
2) Использование для цикла
3) Использование цикла while
4) Использование массива forEach
и назовите это так:
Не рекомендуется делать что-то подобное в Array ...
источник
Забавный подход:
источник
reduce
определенно предпочтительнее в большинстве, если не во всех случаях.[1,"2;YourProgram.ripToShreds();3",4]
NaN
когда пытаюсьeval(['alert("removing your computer")',2,3].join("+"))
неправильный ответ 0/10Стандартное решение JavaScript:
Это работает для меня (результат должен быть 5). Я надеюсь, что в таком решении нет скрытого недостатка.
источник
Таким образом, вы можете поместить все виды экзотических вещей в массив.
Я только наполовину шучу.
источник
eval(['alert("removing your computer")',2,3].join("+"))
Я новичок в JavaScript и кодировании в целом, но я обнаружил, что простой и легкий способ суммирования чисел в массиве выглядит так:
По сути, я хотел внести свой вклад, потому что я не видел много решений, которые не используют встроенные функции, и этот метод легко написать и понять.
источник
Короткий кусок кода JavaScript сделает эту работу:
источник
Несколько человек предложили добавить
.sum()
метод кArray.prototype
. Обычно это считается плохой практикой, поэтому я не предлагаю вам это делать.Если вы все еще настаиваете на этом, то это краткий способ написать это:
тогда:
[1,2].sum(); // 3
Обратите внимание, что функция, добавленная в прототип, использует смесь функций ES5 и ES6 и синтаксиса стрелок.
function
Объявляется , чтобы метод , чтобы получитьthis
контекст отArray
который вы работаете на. Я использовал=>
для краткости внутриreduce
звонка.источник
Используйте
for
цикл:Или даже
forEach
циклДля простоты используйте
reduce
:источник
Не надо
initial value
! Потому что, если noinitial value
не передано, тоcallback function
первый элемент списка не вызывается, а первый элемент вместо этого передается какinitial value
. Очень хорошая черта :)источник
Вот элегантное однострочное решение, которое использует алгоритм стека , хотя может потребоваться некоторое время, чтобы понять всю прелесть этой реализации.
По сути, функция принимает массив и проверяет, содержит ли массив ровно один элемент. Если false, он выталкивает последний элемент из стека и возвращает обновленный массив.
Прелесть этого фрагмента в том, что функция включает
arr[0]
проверку для предотвращения бесконечного зацикливания. Как только он достигает последнего элемента, он возвращает всю сумму.источник
Вы можете объединить метод redu () с лямбда-выражением:
источник
использование
reduce
источник
я видел, что все ответы идут на решение «уменьшить»
источник
точность
Сортировать массив и начальную сумму из наименьших чисел (фрагмент показывает разницу с несортировкой)
Показать фрагмент кода
Для многомерного массива чисел используйте
arr.flat(Infinity)
Показать фрагмент кода
источник
Крутые трюки здесь, у меня есть гниль с множеством безопасных традиционных ответов, не кэширующих длину массива.
Без кеширования длины массива JS-компилятору необходимо проходить через массив при каждой итерации цикла, чтобы вычислить длину, в большинстве случаев это лишние издержки. V8 и многие современные браузеры оптимизируют это для нас, так что это не так важно, как раньше, но есть более старые устройства, которые выигрывают от этого простого кэширования.
Если длина может быть изменена, кэширование может вызвать некоторые неожиданные побочные эффекты, если вы не знаете, почему вы кэшируете длину, но для функции многократного использования, единственная цель которой - взять массив и сложить значения вместе, это отлично подходит.
Вот ссылка CodePen для этой функции arraySum. http://codepen.io/brandonbrule/pen/ZGEJyV
Возможно, это устаревшее мышление, которое застряло у меня, но я не вижу недостатка в его использовании в этом контексте.
источник
Это действительно хорошие ответы, но на всякий случай, если числа в последовательности, как в вопросе (1,2,3,4), вы можете легко сделать это, применив формулу (n * (n + 1)) / 2 где n - последнее число
источник
источник
Это намного проще
источник
Простой пример метода:
источник