创建一个二维数组,由另一二维数组的acumulation的

问题描述:

我有一个数组是这样的:[[0, 50], [1, 40], [2, 30], [3, 20], [5, 10]]创建一个二维数组,由另一二维数组的acumulation的

而且我要应用于堆积第二值:[[0, 50], [1, 90], [2, 120], [3, 140], [5, 150]]

我试过的代码部分,低于该工作对于一维数组,但它不适用于二维数组。是否有可能通过使用减少功能来累积它?还是有不同的方式来做到这一点?

var array1 = [[0, 50], [1, 40], [2, 30], [3, 20], [5, 10]]; 
var newArray1 = []; 

array1.reduce(
    function (previousValue, currentValue, currentIndex) { 
     return newArray1[currentIndex] = [currentIndex, (previousValue[1] + currentValue[1])]; 
    }, 0 
); 

您可以使用map()可选thisArg参数

var array1 = [[0, 50], [1, 40], [2, 30], [3, 20], [5, 10]]; 
 

 
var result = array1.map(function(e) { 
 
    this.num = (this.num || 0) + e[1]; 
 
    return [e[0], this.num]; 
 
}, {}); 
 

 
console.log(result);

+0

哇,这一个看起来不错.....棘手使用'this' .....;) –

使用Array#reduce方法

var array1 = [ 
 
    [0, 50], 
 
    [1, 40], 
 
    [2, 30], 
 
    [3, 20], 
 
    [5, 10] 
 
]; 
 

 
// initialize as the array of first element in original array 
 
var newArray1 = [array1[0].slice()]; 
 

 
array1 
 
    // get remaining array element except first 
 
    .slice(1) 
 
    // iterate over the array value to generate result array 
 
    .reduce(function(arr, v, i) { 
 
    // copy the array element if you don't want to refer the old 
 
    v = v.slice(); 
 
    // add previous array value 
 
    v[1] += arr[i][1]; 
 
    // push updated array to result array 
 
    arr.push(v); 
 
    // retur the updated array 
 
    return arr; 
 
    // set initial value as array which contains first element(array) copy 
 
    },newArray1); 
 

 

 
console.log(newArray1)


UPDATE 1:用更少的代码的另一种方法

var array1 = [ 
 
    [0, 50], 
 
    [1, 40], 
 
    [2, 30], 
 
    [3, 20], 
 
    [5, 10] 
 
]; 
 

 
var newArray1 = [array1[0].slice()]; 
 

 
array1.slice(1).reduce(function(arr, v, i) { 
 
    arr.push([v[0], v[1] + arr[i][1]]); 
 
    return arr; 
 
}, newArray1); 
 

 

 
console.log(newArray1)


更新2:更加降低的版本,而无需使用Array#slice方法。

var array1 = [ 
 
    [0, 50], 
 
    [1, 40], 
 
    [2, 30], 
 
    [3, 20], 
 
    [5, 10] 
 
]; 
 

 
var newArray1 = array1.reduce(function(arr, v, i) { 
 
    // push value to array add value only if `arr` contains any element 
 
    arr.push([v[0], v[1] + (arr.length && arr[i - 1][1])]); 
 
    return arr; 
 
    // set initial value as an empty array 
 
}, []); 
 

 

 
console.log(newArray1)

只是为了好玩让发明一种新的阵列仿函数,Array.prototype.extend()这就像对面减少。它需要一个数组并通过利用提供的回调从最后一项开始扩展它。当回调返回undefined时,它会延长。让我们看看在这个特殊情况下我们可以如何玩得开心;

Array.prototype.extend = function(cb){ 
 
    var len = this.length + 1, 
 
     res = cb(this[len-1], len-1, this); 
 
    return res ? this.extend(cb) : this; 
 
}; 
 

 
var arr = [[0, 50], [1, 40], [2, 30], [3, 20], [5, 10]], 
 
    cb = function(e,i,a){ 
 
     \t  return i === 0 ? a.push(arr[i]) 
 
     \t     : i < arr.length ? a.push([arr[i][0], arr[i][1] + a[i-1][1]]) 
 
     \t          : void 0; 
 
      }; 
 
result = [].extend(cb); 
 
console.log(result);