Подтвердить что ты не робот

Сумма значений в массиве с использованием jQuery

У меня есть массив, содержащий некоторые значения, и я хочу получить их сумму. Вот пример:

var somearray = ["20","40","80","400"];

Я хочу суммировать эти значения с помощью jQuery. В этом примере результат будет равен 540.

4b9b3361

Ответ 1

Вам не нужен jQuery. Вы можете сделать это, используя цикл for:

var total = 0;
for (var i = 0; i < someArray.length; i++) {
    total += someArray[i] << 0;
}

по теме:

Ответ 2

Для обработки чисел с плавающей запятой:

  • (старше) 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)
  • добавляет только допустимые числа и/или числовые строки, пренебрегая любым голосом (например, [1, 'a', '2'] суммируется до 3)

Ответ 3

Вы можете использовать reduce, который работает во всех браузерах, кроме IE8 и ниже.

["20","40","80","400"].reduce(function(a, b) {
    return parseInt(a, 10) + parseInt(b, 10);
})

Ответ 4

Другой метод, если eval безопасен и быстрый:

eval(["10","20","30","40","50"].join("+"))

Ответ 5

Если вы хотите, чтобы это был метод jquery, вы можете сделать это следующим образом:

$.sum = function(arr) {
    var r = 0;
    $.each(arr, function(i, v) {
        r += v;
    });
    return r;
}

и назовите его следующим образом:

var sum = $.sum(["20", "40", "80", "400"]);

Ответ 6

var total = 0;
$.each(someArray,function() {
    total += parseInt(this, 10);
});

Ответ 7

В 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;
      };
    }

Ответ 8

Вы можете сделать это таким образом.

var somearray = ["20","40","80","400"];

somearray = somearray.map(Number);

var total = somearray.reduce(function(a,b){  return a+b },0)

console.log(total);

Ответ 9

    var arr = ["20.0","40.1","80.2","400.3"],
    sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0; });

Работала отлично для того, что мне нужно. Спасибо vol7ron