Javascript中的多维数组累积和
给定多维数组:Javascript中的多维数组累积和,javascript,multidimensional-array,cumulative-sum,Javascript,Multidimensional Array,Cumulative Sum,给定多维数组: var a = [[3,2,5], [4,1,7], [1,6,8]]; 我希望对每个数组进行累积求和,以返回以下结果: [[3,2,5], [7,3,12], [8,9,20]]; 每个子数组第一个元素的总和:3 4 1 每个子数组第二个元素的总和:2 1 6 每个子阵列第三个元素的总和:5 7 8 我尝试过使用reduce(),但没有达到预期的效果 任何建议,非常感谢 更新- 将其提升到下一个层次: var a = [ [new Date(), 3,2,5]
var a = [[3,2,5], [4,1,7], [1,6,8]];
我希望对每个数组进行累积求和,以返回以下结果:
[[3,2,5], [7,3,12], [8,9,20]];
- 每个子数组第一个元素的总和:3 4 1
- 每个子数组第二个元素的总和:2 1 6
- 每个子阵列第三个元素的总和:5 7 8
var a = [
[new Date(), 3,2,5],
[new Date(), null,1,7],
[new Date(), null,6,8],
[new Date(), 1,2,3]
];
应导致:
[[new Date(), 3,2,5],
[new Date(), null,3,12],
[new Date(), null,9,20],
[new Date(), 4,11,23]]
我的方法是创建多维offsetIndex数组:
var offsetIdx = [];
for (var i=1; i<a.length; i++) {
for (var z=0; z<a[i].length; z++) {
var zValue = a[i][z];
oIdx = offsetIdx[z] || 0;
a[i][z] = zValue && z!==0 ? a[i-1-oIdx][z] + zValue : zValue;
if(!zValue){
offsetIdx[z] = oIdx + 1;
} else {
offsetIdx[z] = 0;
}
}
}
var offsetIdx=[];
for(var i=1;ifor(var i=1;i这将为您提供所有元素的总和。不完全是您所问的,但我将把这个答案留在这里,供将来的访问者使用
(下划线和lodash都有)
然后减+和
_.flatten([1, [2, [3, [4]], 5]]);
// → [1, 2, [3, [4]], 5]
函数累积量(arr){
var结果=[arr[0]];
对于(变量i=1;i
这是一个多么数学的问题
为什么不先转置阵列?关于这个问题的答案--建议解决方案:
_.zip.apply(_, [[1,2,3], [1,2,3], [1,2,3]])
要做到这一点,有很多方法
然后求和应该容易得多-只要.map(f)
其中f
是一个数组函数的和
在我看来,这是一个很好且可读的解决方案,因为“转置+求和”非常符合问题的列求和性质,我会避免使用命令式或循环繁重的解决方案来掩盖这一点。使用数组。reduce
,看起来是这样的
var-arr=[[3,2,5]、[4,1,7]、[1,6,8];
var arr2=arr.reduce(函数(a,b){
var nested=Array.isArray(a[0]);
b=b.map(函数(x,i){
返回x+(嵌套?a[a.length-1]:a[i];
});
如果(嵌套)a.推(b);
返回嵌套?a:[a,b];
});
document.body.innerHTML=''+JSON.stringify(arr2,0,4)+'';
如果对输入应用一个和,那么输出数组的元素数是如何相同的?@NewAlexandria:他在进入每个数组时积累结果,所以第一个数组不会改变,第二个数组是第一个加上自身的和(分别针对每个成员),第三个是第二个结果的总和,再加上它各自的成员,依此类推函数传递对上一个元素的引用。我见过平面1维数组的示例,但不能完全适应多维数组。如果您发布reduce()代码会有所帮助。它应该可以工作,我想看看您做错了什么(或者我做错了什么)如果不是。这一个将不起作用,因为上一个结果将不会更新。例如,当您到达第三个数组时,第二个数组尚未更新以包含第一个数组的和,因此您将只获得第二个数组+第三个数组值,而不是第一个数组+第二个数组+第三个数组值。@char:它起作用,因为他将以前的值取为from的结果,而不是原始的。@char它确实工作。原因是结果数组确实存储原始的累积和,并且下一个元素被设置为结果数组的上一个元素和原始数组的下一个元素的和。呜呜,我的坏家伙没有看到他在使用结果值。谢谢大家,所有可行的解决方案s、 我喜欢@char方法,因为它重量轻,使用香草JS和超快。很好。谢谢你的评论Seb。当我选择使用库或非循环方法时,我被雇主斥责了,因为它们会使事情变得更慢。@char告诉你的雇主更多的可维护代码和更少的bug比不可测量的速度增益更重要:)
_.zip.apply(_, [[1,2,3], [1,2,3], [1,2,3]])