我如何用多维数组计算这个平均值?
how can i compute this average with multidimensional array?
我需要计算这种平均值:
stars = [["3", "ciccio"];["5", "ciccio"];["1", "ciccio"];["1", "ciccio"];["5", "ciccio"];["2", "caramella"]]
我想要的是:
avrgArr = [[3, ciccio];[2, caramella]]
我的代码是:
var moon = stars.length-1;
for (var y = 0; y < stars.length; y++) {
avrg= parseInt(stars[y][0]);
for (var z = 1; z < moon; z++) {
if (stars[y][1] === stars[z][1]) {
avrg+= parseInt(stars[z][0]);
count++;
}
}
avrg= avrg/ count;
avrgArr.push([avrg, stars[y][1]]);
}
但是这段代码给出了每个元素的平均值,例如:
avrgArr = [[3.75, ciccio];[2.125, ciccio];[1.0833333333, ciccio];[0.8125, ciccio];[0.85, ciccio];[0.1 caramella]]
我该如何解决这个问题?谢谢:)
首先,使用 O(n) 遍历数据生成一个对象,该对象将名称作为键,将每个名称的总和和计数作为值:
const stars = [["3", "ciccio"],["5", "ciccio"],["1", "ciccio"],["1", "ciccio"],["5", "ciccio"],["2", "caramella"]];
// helper function for reduce
const sum = (data, [value, name]) => {
value = parseInt(value, 10);
// create empty entry if none found
data[name] = data[name] || { count: 0, sum: 0 };
// accumulate data
data[name].count += 1;
data[name].sum += value;
return data;
}
const aggregates = stars.reduce(sum, {});
此时你将拥有:
{ ciccio: { count: 5, sum: 15 }, caramella: { count: 1, sum: 2 } }
这个对象是非常有用的,但是如果你绝对需要你的问题中定义的数组结构,你可以将这个对象转换成那个结构,另一个 O(m) 传递中间结果:
const result = Object.entries(aggregates).map(([name, {count, sum}]) => {
return [ sum / count, name ];
});
我需要计算这种平均值:
stars = [["3", "ciccio"];["5", "ciccio"];["1", "ciccio"];["1", "ciccio"];["5", "ciccio"];["2", "caramella"]]
我想要的是:
avrgArr = [[3, ciccio];[2, caramella]]
我的代码是:
var moon = stars.length-1;
for (var y = 0; y < stars.length; y++) {
avrg= parseInt(stars[y][0]);
for (var z = 1; z < moon; z++) {
if (stars[y][1] === stars[z][1]) {
avrg+= parseInt(stars[z][0]);
count++;
}
}
avrg= avrg/ count;
avrgArr.push([avrg, stars[y][1]]);
}
但是这段代码给出了每个元素的平均值,例如:
avrgArr = [[3.75, ciccio];[2.125, ciccio];[1.0833333333, ciccio];[0.8125, ciccio];[0.85, ciccio];[0.1 caramella]]
我该如何解决这个问题?谢谢:)
首先,使用 O(n) 遍历数据生成一个对象,该对象将名称作为键,将每个名称的总和和计数作为值:
const stars = [["3", "ciccio"],["5", "ciccio"],["1", "ciccio"],["1", "ciccio"],["5", "ciccio"],["2", "caramella"]];
// helper function for reduce
const sum = (data, [value, name]) => {
value = parseInt(value, 10);
// create empty entry if none found
data[name] = data[name] || { count: 0, sum: 0 };
// accumulate data
data[name].count += 1;
data[name].sum += value;
return data;
}
const aggregates = stars.reduce(sum, {});
此时你将拥有:
{ ciccio: { count: 5, sum: 15 }, caramella: { count: 1, sum: 2 } }
这个对象是非常有用的,但是如果你绝对需要你的问题中定义的数组结构,你可以将这个对象转换成那个结构,另一个 O(m) 传递中间结果:
const result = Object.entries(aggregates).map(([name, {count, sum}]) => {
return [ sum / count, name ];
});