Helpex - Trao đổi & giúp đỡ Đăng nhập
45

Tôi có một mảng chứa một số giá trị và tôi muốn lấy tổng của chúng. Đây là ví dụ:

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

Tôi muốn tính tổng các giá trị này bằng jQuery. Trong ví dụ này, kết quả sẽ là 540.

45 hữu ích 0 bình luận 137k xem chia sẻ
58

Bạn không cần jQuery. Bạn có thể làm điều này bằng cách sử dụng một forvòng lặp:

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

Có liên quan:

58 hữu ích 5 bình luận chia sẻ
72

Để cũng xử lý số dấu phẩy động:

  • (Cũ hơn) 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);
    

    Giảm () có sẵn trong các phiên bản ECMAScript cũ hơn, chức năng mũi tên là điều làm cho ES6 này trở nên cụ thể.

    Tôi đang chuyển 0 làm pvgiá trị đầu tiên , vì vậy tôi không cần parseFloat xung quanh nó - nó sẽ luôn giữ tổng trước đó, sẽ luôn là số. Bởi vì giá trị hiện tại cv,, có thể không phải là số ( NaN), chúng tôi sử dụng ||0trên nó để bỏ qua giá trị đó trong mảng. Điều này thật tuyệt nếu bạn muốn chia nhỏ một câu và lấy tổng các con số trong đó. Đây là một ví dụ chi tiết hơn:

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

Những gì ở trên giúp bạn:

  • khả năng nhập bất kỳ loại giá trị nào vào mảng; số hoặc chuỗi số ( 123hoặc "123"), chuỗi dấu chấm động hoặc số ( "123.4"hoặc 123.4) hoặc thậm chí văn bản ( abc)
  • chỉ thêm các số và / hoặc chuỗi số hợp lệ, bỏ qua bất kỳ văn bản trống nào (ví dụ: tổng [1, 'a', '2'] thành 3)
72 hữu ích 2 bình luận chia sẻ
29

Bạn có thể sử dụng reducetrình duyệt này hoạt động trên tất cả các trình duyệt ngoại trừ IE8 trở xuống.

["20","40","80","400"].reduce(function(a, b) {
    return parseInt(a, 10) + parseInt(b, 10);
})
29 hữu ích 2 bình luận chia sẻ
25

Một phương pháp khác, nếu eval là an toàn và nhanh chóng:

eval(["10","20","30","40","50"].join("+"))
25 hữu ích 3 bình luận chia sẻ
11

Nếu bạn muốn nó là một phương thức jquery, bạn có thể làm như sau:

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

và gọi nó như thế này:

var sum = $.sum(["20", "40", "80", "400"]);
11 hữu ích 3 bình luận chia sẻ
6
var tổng = 0;
$ .each (someArray, function () {
    tổng + = parseInt (this, 10);
});

6 hữu ích 2 bình luận chia sẻ
5

Trong http://bugs.jquery.com/ticket/1886 , rõ ràng là các nhà phát triển jQuery có vấn đề về tâm thần nghiêm trọng reg. lập trình chức năng bổ sung cảm hứng. Bằng cách nào đó, thật tốt khi có một số thứ cơ bản (như bản đồ) nhưng không phải những thứ khác (như giảm bớt), trừ khi nó làm giảm kích thước tệp tổng thể của jQuery. Đi tìm con số.

Một cách hữu ích, ai đó đã đặt mã để sử dụng hàm giảm thông thường cho mảng jQuery:

$ .fn.reduce = [] .reduce;

Bây giờ chúng ta có thể sử dụng một hàm giảm đơn giản để tạo một tổng kết:

//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)

Cuối cùng, vì một số trình duyệt cũ hơn chưa được triển khai giảm, một polyfill có thể được lấy từ MDN (nó lớn nhưng tôi đoán nó có cùng một hành vi, điều này là mong muốn):

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;
      };
    }
5 hữu ích 1 bình luận chia sẻ
5

Bạn có thể làm theo cách này.

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

somearray = somearray.map(Number);

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

console.log(total);
5 hữu ích 2 bình luận chia sẻ
1
    var arr = ["20.0","40.1","80.2","400.3"],
    sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0; });

Làm việc hoàn hảo cho những gì tôi cần. Cảm ơn vol7ron

1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ javascript jquery arrays , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading