我有一个像这样的对象。它们的键是时间戳,值是我的号码
var history = {
'1505845390000': 295426,
'1505757979000': 4115911,
'1505677767000': 4033384,
'1505675472000': 4033384,
'1505591090000': 3943956,
'1505502071000': 3848963,
'1505499910000': 3848963,
'1505499894000': 3848963
}
我想做的是:
1)对于最近5个日期(键),获取值的平均值 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 );
}