我如何用多维数组计算这个平均值?

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 ];
});