4 回答
TA贡献1828条经验 获得超13个赞
let array = [
["House1", 1.0, 2.0, 5.0, 1.0],
["House1", 1.0, 4.0, 2.0, 3.0],
["House2", 2.0, 3.0, 3.0, 4.0],
["House2", 5.0, 4.0, 3.0, 4.0],
["House2", 4.0, 5.0, 2.0, 2.0],
["House3", 2.0, 1.0, 4.0, 5.0]];
let averageArrays = arrays =>
arrays.reduce((sum, a) => {
a.forEach((v, i) => sum[i] = (sum[i] || 0) + v / arrays.length);
return sum;
}, []);
let grouped = array.reduce((acc, a) => {
acc[a[0]] = acc[a[0]] || [];
acc[a[0]].push(a.slice(1));
return acc;
}, {});
let averages = Object.entries(grouped).map(([name, arrays]) => [name, ...averageArrays(arrays)]);
console.log(averages);
TA贡献1869条经验 获得超4个赞
以下代码在GAS环境中进行了测试。
function myFunction() {
var array = [
["House1", 1.0, 2.0, 5.0, 1.0],
["House1", 1.0, 4.0, 2.0, 3.0],
["House2", 2.0, 3.0, 3.0, 4.0],
["House2", 5.0, 4.0, 3.0, 4.0],
["House2", 4.0, 5.0, 2.0, 2.0],
["House3", 2.0, 1.0, 4.0, 5.0]
];
var avg = {}, count = {};
array.forEach(function(a) {
var key = a.shift();
if (avg[key]) {
for (var i = 0; i < 4; i++) {
avg[key][i] += a[i];
}
count[key]++;
} else {
avg[key] = a;
count[key] = 1;
}
});
var result = [];
for (var key in avg) {
for (var i = 0; i < 4; i++) {
avg[key][i] /= count[key];
}
avg[key].unshift(key);
result.push(avg[key]);
}
Logger.log(result);
}
可能是,它很长,但每一步都很清楚。我们在avg和count对象中累积中间结果,根据需要将其转换为结果数组。
添加回答
举报
