使用对象键作为日期以获得值的平均值

时间:2017-09-20 18:57:07

标签: javascript json object

我有一个像这样的对象。它们的键是时间戳,值是我的号码

var history = {
     '1505845390000': 295426,
     '1505757979000': 4115911,
     '1505677767000': 4033384,
     '1505675472000': 4033384,
     '1505591090000': 3943956,
     '1505502071000': 3848963,
     '1505499910000': 3848963,
     '1505499894000': 3848963
}

我想做的是:

1)对于最近5个日期(键),获取值的平均值 2)对于日期范围,获取值的平均值

2 个答案:

答案 0 :(得分:1)

您可以针对第一种情况执行以下操作

var obj = {
     '1505845390000': 295426,
     '1505757979000': 4115911,
     '1505677767000': 4033384,
     '1505675472000': 4033384,
     '1505591090000': 3943956,
     '1505502071000': 3848963,
     '1505499910000': 3848963,
     '1505499894000': 3848963
}

let ans = Object.keys(obj).sort();

ans = ans.slice(ans.length-5).reduce((a, b) => a+obj[b], 0);

console.log(ans/5);

对于第二种情况,你可以做

var obj = {
     '1505845390000': 295426,
     '1505757979000': 4115911,
     '1505677767000': 4033384,
     '1505675472000': 4033384,
     '1505591090000': 3943956,
     '1505502071000': 3848963,
     '1505499910000': 3848963,
     '1505499894000': 3848963
}

let start = '1505591090000', end = '1505845390000'
let ans = Object.keys(obj).filter(e => e>=start && e<=end);

let result = ans.reduce((a,b) => a+obj[b],0)/ans.length

console.log(result);

答案 1 :(得分:0)

这个答案很好地解释了如何通过键来过滤对象:

https://stackoverflow.com/a/38750895/5009210

基本上使用Object.keys()获取密钥数组,然后Array.filter()选择所需的密钥,然后使用Array.reduce()重建具有过滤密钥相关值的对象。像这样:

Object.keys( history )
   .filter( someFilterFunction )
   .reduce( (obj, key) => {
      obj[key] = history[key];
   }, {});

完成此操作后,您可以使用Object.values()提取剩余的值,然后将其传递给简单的平均函数(我假设您需要平均值):

function meanAverage( valuesToAverage ) {
    //avoid divide by zero
    if ( valuesToAverage.length ) {
       const valueSum = sum( valuesToAverage );
       return valueSum / valuesToAverage.length;
    }
    return 0;
}

function sum( valuesToSum ) {
   return valuesToSum.reduce( (a, b) => a + b );
}