如何解决如何在 JSON 数组中找到每个日期的最新时间?
我有这个 JSON 格式的数组:
var result=[
{
"index": 13,"id": 1122,
*
解决方法
以下方法:
- 从数组中获取仅包含日期的唯一列表,即 dd/mm/yyyy
- 对于唯一列表中的每个日期,根据该日期的时间创建一个排序数组
- 从该日期的排序数组中返回第 0 个项目
示例代码:
var result = [
{
"index": 13,"id": 1122,"price": 100,"dateTime": "11/12/2020 1:59"
},{
"index": 14,"price": 300,"dateTime": "11/12/2020 3:15"
},{
"index": 15,"price": 314,"dateTime": "11/13/2020 2:20"
},{
"index": 16,"price": 280,"dateTime": "11/13/2020 2:23"
}
];
// get a list of the dates in result
// nothing fancy - the date is just a key
var dates = result.map(k => k.dateTime.substr(0,10));
// get unique dates from this array
var uniqueDates = Array.from(new Set(dates));
// for each unique date,sort the times descending
// return the first item (latest) for that date
var filtered = uniqueDates.map(ud => {
var dateItems = result.filter(d => d.dateTime.substr(0,10) == ud);
dateItems.sort((a,b) => (new Date(b.dateTime)).getTime() - (new Date(a.dateTime)).getTime());
return dateItems[0];
});
// output
console.log(filtered);
根据 Date
的 dateTime
值对数组进行排序,写入一个仅以日期为键的结果数组,检索结果的值。
顺便说一下,TypeError
是因为您应该检查循环中的 i + 1
是否小于 result.length
(对于其中的最后一个元素,这将是 falsy
循环。在这种情况下,new Date(result[i+1].dateTime)
将抛出错误)。
// initialize log helper
const log = Logger();
// create an empty Object
const result = {};
// sort data ascending
const dataSorted = getData().sort((a,b) =>
new Date(a.dateTime) - new Date(b.dateTime));
// add to result with datestring as key.
// The value with the most recent date will be preserved
// because key values are unique (so equal keys are overwritten)
dataSorted.forEach(v => result[new Date(v.dateTime).toDateString()] = v);
// the values of [result] contain the most recent records per date
log(Object.values(result));
// this can also be a one liner,using a reducer method
const resultX = Object.values(
getData()
.sort( (a,b) => new Date(a.dateTime) - new Date(b.dateTime) )
.reduce( (acc,value) =>
({...acc,[new Date(value.dateTime).toDateString()]: value}),{} )
);
log(`\n**from reducer`,resultX);
function getData() {
return [{
"index": 13,"dateTime": "11/12/2020 1:59"
},{
"index": 14,"dateTime": "11/12/2020 3:15"
},{
"index": 15,"dateTime": "11/13/2020 2:20"
},{
"index": 16,"dateTime": "11/13/2020 2:23"
}
];
}
function Logger() {
const report = document.querySelector("#report") ||
document.body.insertAdjacentElement(
"beforeend",Object.assign(document.createElement("pre"),{id: "report"}));
return (...args) => args.forEach(stuff =>
report.textContent += (stuff instanceof Object
? JSON.stringify(stuff,null,2) : stuff) + "\n");
}
您可以根据日期对数据进行分组,例如
const groups = data.reduce((groups,currVal) => {
const date = currVal.dateTime.split(' ')[0];
if (!groups[date]) {
groups[date] = [];
}
groups[date].push(currVal);
return groups;
},{});
->这里我们用split(' ')
分割日期和时间部分,单独取日期组成一个组,
const date = currVal.dateTime.split(' ')[0];
然后你可以使用该方法获取最近的日期和时间,
groups[item].reduce((a,b) => (a.dateTime > b.dateTime ? a : b));
工作片段:
const data = [
{
"index": 13,{
"index": 14,{
"index": 15,{
"index": 16,"dateTime": "11/13/2020 2:23"
}
];
//Group the data based on date
const groups = data.reduce((groups,{});
//Get the recent date and time based on each group
const result = [];
Object.keys(groups).filter(item => {
const newData = groups[item].reduce((a,b) => (a.dateTime > b.dateTime ? a : b));
result.push(newData);
});
console.log(result)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。