创建一个由另一个2d数组的累积组成的二维数组

时间:2016-08-04 10:48:08

标签: javascript arrays

我有一个类似的数组:[[0, 50], [1, 40], [2, 30], [3, 20], [5, 10]]

我希望累积第二个值:[[0, 50], [1, 90], [2, 120], [3, 140], [5, 150]]

我尝试了下面适用于一维数组的代码部分,但它不适用于2d数组。是否可以通过使用reduce函数来累积它?或者有不同的方法吗?

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 个答案:

答案 0 :(得分:3)

您可以将map()与可选的 sample_value operator_seq actual_value result ID:Desktop|Height:627|Width:768 =,>,> ID:Desktop|Height:600|Width:1024 0 ID:Desktop|Height:627|Width:768 =,>,> ID:Desktop|Height:600|Width:600 1 参数

一起使用

thisArg

答案 1 :(得分: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)




<小时/> 更新1 :使用较少代码

的另一种方法

&#13;
&#13;
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)
&#13;
&#13;
&#13;

更新2 :在不使用 Array#slice 方法的情况下,版本减少了很多。

&#13;
&#13;
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)
&#13;
&#13;
&#13;

答案 2 :(得分:0)

只是为了好玩,我们发明一个新的数组仿函数,Array.prototype.extend()这与reduce相反。它需要一个数组,并通过利用提供的回调从最后一项开始扩展它。当回调返回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){
     	    return i === 0 ? a.push(arr[i])
     	                   : i < arr.length ? a.push([arr[i][0], arr[i][1] + a[i-1][1]])
     	                                    : void 0;
          };
 result = [].extend(cb);
 console.log(result);