У меня есть что-то вроде этого:
$scope.traveler = [
{ description: 'Senior', Amount: 50},
{ description: 'Senior', Amount: 50},
{ description: 'Adult', Amount: 75},
{ description: 'Child', Amount: 35},
{ description: 'Infant', Amount: 25 },
];
Теперь, чтобы получить общее количество этого массива, я делаю что-то вроде этого:
$scope.totalAmount = function(){
var total = 0;
for (var i = 0; i < $scope.traveler.length; i++) {
total = total + $scope.traveler[i].Amount;
}
return total;
}
Это легко, когда есть только один массив, но у меня есть другие массивы с другим именем свойства, которые я хотел бы суммировать.
Я был бы счастлив, если бы я мог сделать что-то вроде этого:
$scope.traveler.Sum({ Amount });
Но я не знаю, как пройти через это таким образом, чтобы я мог использовать его в будущем так:
$scope.someArray.Sum({ someProperty });
Ответ
Я решил использовать предложение @ gruff-bunny, чтобы избежать прототипирования нативного объекта (Array)
Я только что сделал небольшую модификацию его ответа, проверяя массив и значение sum не равны null, это моя последняя реализация:
$scope.sum = function (items, prop) {
if (items == null) {
return 0;
}
return items.reduce(function (a, b) {
return b[prop] == null ? a : a + b[prop];
}, 0);
};
javascript
arrays
prototype-programming
nramirez
источник
источник
Ответы:
Обновленный ответ
Из-за всех недостатков добавления функции в прототип Array я обновляю этот ответ, чтобы предоставить альтернативу, которая поддерживает синтаксис, аналогичный синтаксису, первоначально запрошенному в вопросе.
Оригинальный ответ
Поскольку это массив, вы можете добавить функцию в прототип Array.
Скрипка: http://jsfiddle.net/9BAmj/
источник
Array.prototype
как это может нарушить ваш код в будущем. Почему расширение нативных объектов - плохая практика? ,Я знаю, что на этот вопрос есть приемлемый ответ, но я подумал, что я добавлю альтернативу, которая использует array.reduce , так как суммирование массива является каноническим примером для Reduce :
Fiddle
источник
$scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');
в начале функции контроллера?источник
return Number(item.Amount);
проверить только номерprev
в функции Reduce. Для меня это означает, что вы получаете предыдущее значение в массиве. Но на самом деле это сокращение всех предыдущих значений. Мне нравитсяaccumulator
,aggregator
илиsumSoFar
для большей ясности.Я всегда избегаю изменения метода-прототипа и добавления библиотеки, так что это мое решение:
Достаточно использовать метод-прототип Reduce Array
источник
a
) делает трюк при использованииreduce
с объектами: в первой итерацииa
не будет первым объектомitems
массива, а будет0
.const sumBy = (items, prop) => items.reduce((a, b) => +a + +b[prop], 0);
Использование:sumBy(traveler, 'Amount') // => 235
reduce
синтаксис выглядит совершенно тупым для меня. Мой мозг до сих пор "родной" понимает это лучше:let total = 0; items.forEach((item) => { total += item.price; });
let total = 0; items.forEach(item => total += item.price)
Я решил отбросить два своих цента: это одна из тех операций, которая всегда должна быть чисто функциональной, не полагаться на какие-либо внешние переменные. Некоторые уже дали хороший ответ, используя
reduce
это путь сюда.Поскольку большинство из нас уже может позволить себе использовать синтаксис ES2015, вот мое предложение:
Мы делаем его неизменной функцией, пока мы на ней. Что
reduce
делает здесь просто: Start со значением0
для аккумулятора, и добавить значение текущего элемента зацикленного на него.Yay для функционального программирования и ES2015! :)
источник
Альтернатива для улучшения читаемости и использования
Map
иReduce
:Повторно используемая функция:
источник
.reduce(*** => *** + ***, 0);
другим не хватало, что "+1"Вы можете сделать следующее:
источник
Это работает для меня
TypeScript
иJavaScript
:Я надеюсь, что это полезно.
источник
Я не уверен, что это было упомянуто еще. Но для этого есть функция lodash . Фрагмент ниже, где значение - это ваш атрибут, а сумма - это «значение».
Оба будут работать.
источник
также можно использовать Array.prototype.forEach ()
источник
Вот однострочник, использующий функции стрелок ES6.
источник
Как суммировать массив объектов с помощью Javascript
источник
Из массива объектов
источник
Я уже использовал jquery. Но я думаю, что это достаточно интуитивно понятно, чтобы просто иметь:
По сути, это всего лишь краткая версия ответа @ akhouri.
источник
Вот решение, которое я считаю более гибким:
Чтобы получить сумму, просто используйте ее так:
источник