【问题标题】:how can i compute this average with multidimensional array?我如何用多维数组计算这个平均值?
【发布时间】:2021-05-04 08:40:05
【问题描述】:

我需要计算这种平均值:

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]]

我该如何解决这个问题?谢谢你:)

【问题讨论】:

  • 为什么将数字作为字符串存储在数据中?
  • @Alnitak 这些数字来自复选框,我正在存储字段“值”
  • 最佳做法是尽早将这些 .value 字段转换为适当的数字。
  • @Alnitak 我在我的代码中解析了它们

标签: javascript arrays multidimensional-array average parseint


【解决方案1】:

首先,使用 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 ];
});

【讨论】:

  • 谢谢!!我现在正在测试这个:)
  • @LabarbonaDibaggio 我即将发布更干净的更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2017-02-06
  • 2019-04-22
  • 2020-12-09
相关资源
最近更新 更多