创建一个二维数组,由另一二维数组的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);
答
UPDATE 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)
答
只是为了好玩让发明一种新的阵列仿函数,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);
哇,这一个看起来不错.....棘手使用'this' .....;) –