【问题标题】:Get average of each day in array获取数组中每一天的平均值
【发布时间】:2019-01-14 22:08:07
【问题描述】:

我正在尝试在 Javascript/jQuery 中找到一种有效的方法来执行以下操作:

我得到了一个包含对象的数组,每个对象都包含一个日期和一个评级。许多条目具有相同的日期。我想创建另一个对象数组,每个对象都包含日期(唯一)和当天所有评分的平均值。

示例数据:

var array = [{
    date: "07-08-2018"
    rating: 3
    },{
    date: "07-08-2018"
    rating: 5
    },{
    date: "08-08-2018"
    rating: 2
    },{
    date: "08-08-2018"
    rating: 1
    },{
    date: "09-08-2018"
    rating: 3
    },{
    date: "09-08-2018"
    rating: 5
    }
]

我要做什么:

var averageArray = [{
    date: "07-08-2018",
    rating: 4
    },{
    date: "08-08-2018",
    rating: 1.5
    },{
    date: "09-08-2018",
    rating: 4
    }]

我当前的代码(只返回 2 个值而不是 3 个)

var oldDate = new Date(array[0].date);
var sum = 0;
var counter = 0
var newArray = []

for(var i = 0; i < array.length; i++){
    var date = new Date(array[i].date);

    if(date > oldDate){
        console.log("new day");
        var avg = (sum/counter);
        //console.log(avg);
        var newObject = new Object({
            date: date,
            rating: avg
        });
        newArray.push(newObject);
        counter = 0;
        sum = 0;
        oldDate = date;
    }
    counter++;
    sum = sum + array[i].rating;
    console.log(counter + " " + sum)
}

console.log(newArray)

【问题讨论】:

  • 请向我们展示您尝试过的方法并概述您遇到问题的地方。 Stackoverflow 不是免费的代码编写服务。此处的目标是让其他人在您的代码未按预期工作时帮助您改进
  • 忘记了,只是添加了我当前的代码。最终数组中只返回两个值,感觉需要很多行。

标签: javascript jquery arrays node.js


【解决方案1】:

对事物进行分组的最佳方法是创建一个使用公共值作为属性键的对象。

然后将它们分组到该对象中后,将结果映射到新数组

var tmp ={};

data.forEach(function(item){
  // if property for current date already exists  we update existing otherwise start new one
  var obj =  tmp[item.date] = tmp[item.date] || {count:0, total: 0};
  // increment count and total of all the ratings
  obj.count ++;
  obj.total += item.rating

});

var res = Object.entries(tmp).map(function(entry){
    return { date: entry[0], ave: entry[1].total/entry[1].count}
})

console.log( res)
<script>
var data = [{
    date: "07-08-2018",
    rating: 3
    },{
    date: "07-08-2018",
    rating: 5
    },{
    date: "08-08-2018",
    rating: 2
    },{
    date: "08-08-2018",
    rating: 1
    },{
    date: "09-08-2018",
    rating: 3
    },{
    date: "09-08-2018",
    rating: 5
    }
]
</script>

【讨论】:

  • 太棒了,谢谢!您能否详细说明这一行发生了什么:var obj = tmp[item.date] = tmp[item.date] || {计数:0,总数:0};
  • 当然。它是if(tmp[item.date]){ tmp[item.date] = tmp[item.date]/* equals existing*/}else{tmp[item.date] = {/* new object*/} } 的简写。然后var obj = tmp[item.date] 只是为了缩短更新属性值的时间
  • 输入console.log(tmp) 看看它是什么样子
  • 谢谢!我学会了一种新的速记方式,而不是使用带有 ?: 的三元运算符。
猜你喜欢
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2018-10-26
  • 2022-11-10
  • 2020-03-09
相关资源
最近更新 更多