我有一个类似的数组:[[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
);
答案 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 :使用较少代码
的另一种方法
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;
更新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)
&#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);