2016-08-04 112 views
1

我有一個數組是這樣的:[[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 
); 

回答

3

您可以使用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' .....;) –

1

使用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)

0

只是爲了好玩讓發明一種新的陣列仿函數,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);