使用函数式编程对二维数组中的列进行平均

Roc*_*cky 4 javascript arrays loops functional-programming node.js

作为函数式编程的练习,我决定浏览一下我的一个项目,并将包含 for 循环的函数替换为 的Array.prototype高阶函数,例如mapreduce

我的项目中的一个函数对二维数组中的列进行平均。它需要一个参数,samples它是一个大小为 2d 的数组[n][LOOKBACK]

[
    [0.6,  4.0, -0.5],
    [1.0, -0.5, -0.8],
    ...
]
Run Code Online (Sandbox Code Playgroud)

[
    [0.6,  4.0, -0.5],
    [1.0, -0.5, -0.8],
    ...
]
Run Code Online (Sandbox Code Playgroud)

输出应该是一个大小的数组LOOKBACK,其元素是每列的平均值:

[0.8, 1.75, -0.65]
Run Code Online (Sandbox Code Playgroud)

我花了一些时间试图找出解决方案,但我似乎无法想出一个。

使用 Javascript 的内置数组函数可以实现这一点吗?

*更新

从基里尔那里得到了一个优雅的解决方案。如果其他人有一个好的解决方案,我很乐意看到更多。

Kir*_*nov 5

reduce尝试使用和函数来执行此示例forEach

let a = [
    [0.6,  4.0, -0.5],
    [3.0, -0.5, -0.1],
    [1.0, -0.2, -0.8],
    [7.0, -0.5, -0.8]
];

let b = a.reduce((acc, cur) => {
    cur.forEach((e, i) => acc[i] = acc[i] ? acc[i] + e : e);
    return acc;
}, []).map(e => e / a.length);

console.log(b);
Run Code Online (Sandbox Code Playgroud)

这是使用矩阵转置的更巧妙的方法:

let a = [
    [0.6,  4.0, -0.5],
    [3.0, -0.5, -0.1],
    [1.0, -0.2, -0.8],
    [7.0, -0.5, -0.8]
];

let b = a[0].map((col, i) => a.map(row => row[i]).reduce((acc, c) => acc + c, 0) / a.length);

console.log(b);
Run Code Online (Sandbox Code Playgroud)