Javascript:通过聚合分组
Javascript: group by with aggregation
本文关键字:Javascript 更新时间:2023-09-26
我有一个简单的json列表,就像下面的列表一样
{
"myList": [
{
"endOfPeriod": 1461362400000,
"rate": 0.03726378
},
{
"endOfPeriod": 1461535200000,
"rate": 0.03726378
},
{
"endOfPeriod": 1461967200000,
"rate": 0.03708314
},
{
"endOfPeriod": 1461708000000,
"rate": 0.03492851
},
{
"endOfPeriod": 1461794400000,
"rate": 0.03845068
},
{
"endOfPeriod": 1461621600000,
"rate": 0.03544827
}
]
}
其中endOfPeriod
是unix历元时间戳。示例中的所有时间戳都属于同一个月(2016年4月),但可能是其他时间段。假设我已经将这个json列表转换为一个数组,并将每个unix时间戳转换为DD.MM.YYYY
日期(我也可以将它们保存在unix时间戳中)。有没有一种有效的方法可以创建一个新的数组,该数组具有按月/年分组的最新速率?
我必须用Javascript编写代码。
例如:
20.04.2016 / 0.33
21.04.2016 / 0.55
14.04.2016 / 0.88
02.05.2016 / 1.33
01.05.2016 / 5.44
新数组必须包含:
21.04.2016 / 0.55
02.05.2016 / 1.33
谢谢你的帮助。
如果我理解正确,您需要提取每个月的最新费率。我会使用lodash
。
_.chain(arr)
.groupBy(function(item) {
var date = new Date(item.endOfPeriod);
return date.getFullYear() + '-' + date.getMonth();
})
.map(function(group) {
return _.maxBy(group, function(item) {
return item.endOfPeriod;
});
})
.value()
我们从以下形式的对象列表开始:
{
"endOfPeriod" : 1464818400000,
"rate" : 0.05
}
chain()
函数将列表封装到一个lodash对象中。
然后,我们按年份和月份对元素进行分组。在groupBy()
之后,我们有以下结构(注意getMonth()在Javascript中是基于0的,因此值3对应于April,依此类推):
{
"2016-3" : [array of objects in April 2016],
"2016-4" : [array of objects in May 2016]
...
}
然后,对于每组,我们取具有最大endOfPeriod
的项目。
最后,value()
将lodash对象展开为一个普通的Javascript数组。
这是一个不使用lodash
的结果。但对我来说,最好不要重新发明轮子。
const myList = [
{
"endOfPeriod": 1461362400000,
"rate": 0.03726378
},
{
"endOfPeriod": 1461535200000,
"rate": 0.03726378
},
{
"endOfPeriod": 1461967200000,
"rate": 0.03708314
},
{
"endOfPeriod": 1461708000000,
"rate": 0.03492851
},
{
"endOfPeriod": 1461794400000,
"rate": 0.03845068
},
{
"endOfPeriod": 1461621600000,
"rate": 0.03544827
}
];
const res = myList.reduce((prev, current) => {
const date = new Date(current.endOfPeriod);
const month = date.getMonth();
const year = date.getFullYear();
const key = `${year}-${month}`;
if (prev[key] && prev[key].endOfPeriod < current.endOfPeriod) {
prev[key] = current;
} else {
prev[key] = current;
}
return prev;
}, {});
const finalResult = Object.keys(res).map((key) => {
return {
key: res[key].rate
}
});
console.log(finalResult);
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Javascript:selenium Web驱动程序isDisplayed()不工作
- 如何通过ajax刷新JSF填充的javascript变量
- 如何在Javascript中将JSon对象转换为数组
- Javascript生成的表单未提交
- 使用javascript将动态表从一个html页面打印到另一个html页
- 通过javascript重定向html传递php变量