У меня есть массив, содержащий некоторые значения, и я хочу получить их сумму. Вот пример:
var somearray = ["20","40","80","400"];
Я хочу суммировать эти значения с помощью jQuery. В этом примере результат будет равен 540.
У меня есть массив, содержащий некоторые значения, и я хочу получить их сумму. Вот пример:
var somearray = ["20","40","80","400"];
Я хочу суммировать эти значения с помощью jQuery. В этом примере результат будет равен 540.
Вам не нужен jQuery. Вы можете сделать это, используя цикл for
:
var total = 0;
for (var i = 0; i < someArray.length; i++) {
total += someArray[i] << 0;
}
по теме:
Для обработки чисел с плавающей запятой:
(старше) JavaScript:
var arr = ["20.0","40.1","80.2","400.3"],
n = arr.length,
sum = 0;
while(n--)
sum += parseFloat(arr[n]) || 0;
ECMA 5.1/6:
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
arr.forEach(function(num){sum+=parseFloat(num) || 0;});
ES6:
var sum = ["20.0","40.1","80.2","400.3"].reduce((pv,cv)=>{
return pv + (parseFloat(cv)||0);
},0);
Функция reduce() доступна в более старых версиях ECMAScript, функция стрелок - это то, что делает этот ES6-специфичным.
Я передаю 0 как первое значение pv
, поэтому мне не нужен parseFloat вокруг него - он всегда будет содержать предыдущую сумму, которая всегда будет числовой. Поскольку текущее значение cv
может быть нечисловым (NaN
), мы используем ||0
на нем, чтобы пропустить это значение в массиве. Это потрясающе, если вы хотите разбить предложение и получить сумму чисел в нем. Вот более подробный пример:
let num_of_fruits = `
This is a sentence where 1.25 values are oranges
and 2.5 values are apples. How many fruits are
there?
`.split(/\s/g).reduce((p,c)=>p+(parseFloat(c)||0), 0);
// num_of_fruits == 3.75
JQuery
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0;});
Чем выше вы получите:
123
или "123"
), строка или номер с плавающей запятой ("123.4"
или 123.4
) или даже текст (abc
)Вы можете использовать reduce
, который работает во всех браузерах, кроме IE8 и ниже.
["20","40","80","400"].reduce(function(a, b) {
return parseInt(a, 10) + parseInt(b, 10);
})
Другой метод, если eval безопасен и быстрый:
eval(["10","20","30","40","50"].join("+"))
Если вы хотите, чтобы это был метод jquery, вы можете сделать это следующим образом:
$.sum = function(arr) {
var r = 0;
$.each(arr, function(i, v) {
r += v;
});
return r;
}
и назовите его следующим образом:
var sum = $.sum(["20", "40", "80", "400"]);
var total = 0; $.each(someArray,function() { total += parseInt(this, 10); });
В http://bugs.jquery.com/ticket/1886 становится очевидным, что у разработчиков jQuery есть серьезные проблемы с умственными проблемами. функциональное программирование вдохновило дополнения. Как-то хорошо иметь некоторые фундаментальные вещи (например, карту), но не другие (например, уменьшить), если только это не уменьшит общий размер файла jQuery. Наведите указатель мыши.
Полезно, кто-то разместил код для использования функции нормального сокращения для массивов jQuery:
$. fn.reduce = [].reduce;
Теперь мы можем использовать простую функцию сокращения для создания суммирования:
//where X is a jQuery array
X.reduce(function(a,b){ return a + b; });
// (change "a" into parseFloat("a") if the first a is a string)
Наконец, поскольку некоторые старые браузеры еще не реализовали сокращение, polyfill можно взять из MDN (он большой, но я думаю он имеет то же самое поведение, которое желательно):
if ( 'function' !== typeof Array.prototype.reduce ) {
Array.prototype.reduce = function( callback /*, initialValue*/ ) {
'use strict';
if ( null === this || 'undefined' === typeof this ) {
throw new TypeError(
'Array.prototype.reduce called on null or undefined' );
}
if ( 'function' !== typeof callback ) {
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;
};
}
Вы можете сделать это таким образом.
var somearray = ["20","40","80","400"];
somearray = somearray.map(Number);
var total = somearray.reduce(function(a,b){ return a+b },0)
console.log(total);
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0; });
Работала отлично для того, что мне нужно. Спасибо vol7ron