如何计算数组中对象值的动态平均值?

Posted

技术标签:

【中文标题】如何计算数组中对象值的动态平均值?【英文标题】:How can I calculate dynamic average of an Object value in an array? 【发布时间】:2020-01-07 08:52:51 【问题描述】:

我有这个数据结构,其中分数是一个由 4 个对象组成的数组

export const scores = [
   day: '1', Barcelona: 1, Real: 3, Valencia: 0,
   day: '2', Barcelona: 4, Real: 6, Valencia: 3,
   day: '3', Barcelona: 7, Real: 7, Valencia: 3,
   day: '4', Barcelona: 7, Real: 8, Valencia: 6,
];

我想计算每支球队的平均分

例如,巴塞罗那的平均值在此数据中为 4.75。

var res = scores.map(score => score.Barcelona).reduce((acc, score) => score + acc);

var total = scores.length

var average = res/total

这是我复制问题的原型。

https://codesandbox.io/s/qecrh?fontsize=14

我需要根据我在下拉列表中选择的团队动态地进行此计算。

我有两个状态 this.state.homeCitythis.state.awayCity 我可以重复使用来动态计算平均值。

【问题讨论】:

【参考方案1】:

根据所选团队过滤数组。将所有值相加并除以scoreslength

    const scores = [
       day: '1', Barcelona: 1, Real: 3, Valencia: 0,
       day: '2', Barcelona: 4, Real: 6, Valencia: 3,
       day: '3', Barcelona: 7, Real: 7, Valencia: 3,
       day: '4', Barcelona: 7, Real: 8, Valencia: 6,
    ]
    
    const calculateAverageByTeam = team =>
        const total = scores.map(x=> x[team]).reduce((a,c) => a +c)
        return total / scores.length
    
    
    const barcelona = calculateAverageByTeam('Barcelona')
    const real = calculateAverageByTeam('Real')
    const valencia = calculateAverageByTeam('Valencia')
    console.log(barcelona, real, valencia)

【讨论】:

如果你愿意在我提供的代码框里给我看,我接受答案 用分叉的沙箱更新了答案【参考方案2】:

您可以从下拉列表中提供团队名称并将其发送到函数以计算该团队的平均得分:

 const scores = [
   day: '1', Barcelona: 1, Real: 3, Valencia: 0,
   day: '2', Barcelona: 4, Real: 6, Valencia: 3,
   day: '3', Barcelona: 7, Real: 7, Valencia: 3,
   day: '4', Barcelona: 7, Real: 8, Valencia: 6,
];

function getAverageScore(scores, team)
 return  scores.reduce((sum, t) => sum + t[team], 0)/ scores.length;

console.log(getAverageScore(scores, "Barcelona"));

【讨论】:

【参考方案3】:

这是一个对代码稍作修改并支持动态值的示例:

const scores = [
   day: '1', Barcelona: 1, Real: 3, Valencia: 0,
   day: '2', Barcelona: 4, Real: 6, Valencia: 3,
   day: '3', Barcelona: 7, Real: 7, Valencia: 3,
   day: '4', Barcelona: 7, Real: 8, Valencia: 6,
];

const printAverage = function() 
  const avg = scores.reduce((acc, c) => acc + c[this.value], 0) / scores.length;
  console.log(avg);


document.getElementById("team").addEventListener("change", printAverage);
<select id="team">
  <option value="Barcelona">Barcelona</option>
  <option value="Real">Real</option>
  <option value="Valencia">Valencia</option>
</select>

【讨论】:

【参考方案4】:

这是使用您提供的沙盒代码的解决方案。基本解决方案是使用obj[key] 属性访问器,它允许动态属性选择。 score['Barcelona']score.Barcelona 一样,但是因为它需要一个字符串,所以我们可以提供一个变量来代替,将下拉列表的值传入。

  getTeamAverage = (team) => 
    const sum = scores.map(score => score[this.state[`$teamCity`]])
    .reduce((acc, score) => score + acc);

    return sum / scores.length;
  

  render() 
  const homeAverage = this.getTeamAverage('home');
  const awayAverage = this.getTeamAverage('away');
    return (
      <div>
        <div className="wrapper">
          <div className="main">
            <div className="container">
              <div className="row">
                <div className="col-xs-5 title-container" />
                <div className="col-xs-7 form-container">
                  Pick the team:
                  <select
                    value=this.state.value
                    onChange=this.handleChangeHomeCity
                  >
                    listItems
                  </select>
                  <select
                    value=this.state.value
                    onChange=this.handleChangeAwayCity
                  >
                    listItems
                  </select>
                  <p>Team 1:this.state.homeCity</p>
                  <p>Team 2:this.state.awayCity</p>
                  <p>Average Score Team 1: homeAverage</p>
                  <p>Average Score Team 2: awayAverage</p>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  

【讨论】:

以上是关于如何计算数组中对象值的动态平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算另一列中特定值的列的平均值?

如何从对象数组中获得平均值

计算数组列表的平均值?

计算嵌入文档/数组中字段的平均值

计算嵌入文档/数组中字段的平均值

如何计算相关值的平均值?