How to sum elements at the same index in array of arrays into a single array?

前端 未结 6 979
陌清茗
陌清茗 2020-12-03 03:05

Let\'s say that I have an array of arrays, like so:

[
  [0, 1, 3],
  [2, 4, 6],
  [5, 5, 7],
  [10, 0, 3]
]

How do I generate a new array t

相关标签:
6条回答
  • 2020-12-03 03:49

    Assuming array is static as op showned.

    a = [
          [0, 1, 3],
          [2, 4, 6],
          [5, 5, 7],
          [10, 0, 3]
        ]
    
    b = []
         	
    for(i = 0; i < a[0].length; i++){						
      count = 0
      for(j = 0; j < a.length; j++){				
         count += a[j][i]			
       }
       b.push(count)
    }		
    console.log(b)

    0 讨论(0)
  • 2020-12-03 03:52

    One-liner in ES6, with map and reduce

    var a = [ [0, 1, 3], [2, 4, 6], [5, 5, 7], [10, 0, 3] ];
    
    var sum = a[0].map((_, i) => a.reduce((p, _, j) => p + a[j][i], 0));
    
    document.write(sum);

    0 讨论(0)
  • 2020-12-03 03:58

    You can use Array.prototype.reduce() in combination with Array.prototype.forEach().

    var array = [
            [0, 1, 3],
            [2, 4, 6],
            [5, 5, 7],
            [10, 0, 3]
        ],
        result = array.reduce(function (r, a) {
            a.forEach(function (b, i) {
                r[i] = (r[i] || 0) + b;
            });
            return r;
        }, []);
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

    Update, a shorter approach by taking a map for reducing the array.

    var array = [[0, 1, 3], [2, 4, 6], [5, 5, 7], [10, 0, 3]],
        result = array.reduce((r, a) => a.map((b, i) => (r[i] || 0) + b), []);
        
    console.log(result);

    0 讨论(0)
  • 2020-12-03 04:06

    Using Lodash 4:

    function sum_columns(data) {
      return _.map(_.unzip(data), _.sum);
    }
    
    var result = sum_columns([
      [1, 2],
      [4, 8, 16],
      [32]
    ]);
    
    console.log(JSON.stringify(result));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

    For older Lodash versions and some remarks

    Lodash 4 has changed the way _.unzipWith works, now the iteratee gets all the values passed as spread arguments at once, so we cant use the reducer style _.add anymore. With Lodash 3 the following example works just fine:

    function sum_columns(data) {
      return _.unzipWith(data, _.add);
    }
    
    var result = sum_columns([
      [1, 2],
      [4, 8, 16],
      [32],
    ]);
    
    console.log(JSON.stringify(result));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

    _.unzipWith will insert undefineds where the row is shorter than the others, and _.sum treats undefined values as 0. (as of Lodash 3)

    If your input data can contain undefined and null items, and you want to treat those as 0, you can use this:

    function sum_columns_safe(data) {
      return _.map(_.unzip(data), _.sum);
    }
    
    function sum_columns(data) {
      return _.unzipWith(data, _.add);
    }
    
    console.log(sum_columns_safe([[undefined]])); // [0]
    console.log(sum_columns([[undefined]]));      // [undefined]
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

    This snipet works with Lodash 3, unfortunately I didn't find a nice way of treating undefined as 0 in Lodash 4, as now sum is changed so _.sum([undefined]) === undefined

    0 讨论(0)
  • 2020-12-03 04:08

    Assuming that the nested arrays will always have the same lengths, concat and reduce can be used.

        function totalIt (arr) {
            var lng = arr[0].length;
           return [].concat.apply([],arr)  //flatten the array
                    .reduce( function(arr, val, ind){ //loop over and create a new array
                        var i = ind%lng;  //get the column
                        arr[i] = (arr[i] || 0) + val; //update total for column
                        return arr;  //return the updated array
                    }, []);  //the new array used by reduce
        }
        
        var arr = [
          [0, 1, 3],
          [2, 4, 6],
          [5, 5, 7],
          [10, 0, 3]
        ];
        console.log(totalIt(arr));  //[17, 10, 19]

    0 讨论(0)
  • 2020-12-03 04:10
    const ar = [
      [0, 1, 3],
      [2, 4, 6],
      [5, 5, 7],
      [10, 0, 3]
    ]   
    
    ar.map( item => item.reduce( (memo, value)=> memo+= value, 0 ) )
    //result-> [4, 12, 17, 13]
    
    0 讨论(0)
提交回复
热议问题