2011-12-18 4 views

ответ

48

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

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

Похожие:

+0

весьма полезным благодаря маркировать –

+6

Вы не должны использовать 'для (х в SomeArray)' с массивами, так как он перечисляет перечисляемые свойства массива, а не только элементы массива. Вы должны использовать 'for (var i = 0; i jfriend00

+0

@ jfriend00: Спасибо! Починил это. –

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

+0

Плакат загружает каждый элемент в виде строки, поэтому вам нужно либо «parseInt», «parseFloat», либо умножить на 1. – vol7ron

+0

yea true, отредактированный –

+0

также может добавить карту чтобы разделить parseInt, но не думайте, что он наберет много – jamiebarrow

52

также обрабатывать числа с плавающей точкой:

  • (Старая) 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); 
    

    Функция сокращения() доступна в более старых версиях 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, 'а', '2'] подводит к 3)
+0

, я бы удвоил вот так :) – user2831723

9

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

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

и назвать его так:

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

Nice. Мне нравится ваш подход. –

+0

Изменить на 'r + = parseInt (v);' потому что '" 20 "' строка, а не целое число. –

+0

Или 'parseFloat (v)' – pshep123

26

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

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

Вам не нужно 'parseInt (a)' потому что 'a' является предыдущим возвратом' reduce', это уже номер. Ну, кроме первого вызова, но тогда вы можете добавить '0' в качестве параметра для уменьшения, и все будет хорошо. – gberger

+0

Это самое близкое к тому, что я хотел. Итак, имеет ли jQuery независимое от браузера сокращение (например, подчеркивание?)? http://bugs.jquery.com/ticket/1886 - бог, это удивительно глупо. – Lodewijk

22

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

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

Это удивительно странное решение. Я не знаю об этом, это странно. В качестве примечания: пожалуйста, никогда не используйте eval, если можете. – Lodewijk

+0

В общем, на самом деле не рекомендуется использовать eval, потому что редко можно гарантировать, что он безопасен и (думаю), он также не будет (намного) быстрее, чем уменьшит. – Trilarion

+0

Почему «никогда не использовать eval»? Я должен был использовать его в своем последнем контракте, потому что мы сохраняли функции в JSON в базе данных (я его не проектировал) как строки. Иногда это подходящее решение. –

3

В 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; 
     }; 
    } 
0
var arr = ["20.0","40.1","80.2","400.3"], 
    sum = 0; 
$.each(arr,function(){sum+=parseFloat(this) || 0; }); 

работал отлично за то, что мне нужно. Спасибо vol7ron

3

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

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

somearray = somearray.map(Number); 

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

console.log(total); 
+0

Не поддерживается IE8. Также повысит ошибку, если массив пуст, лучше используйте '.reduce (function (a, b) {return a + b;}, 0)', который безопасно возвращает 0 в пустой массив. –

+0

Спасибо @ Бени Чернявский-Паскин. я обновил свой ответ –

Смежные вопросы