如何按其 Date 属性筛选对象数组,该属性每天仅显示最后存储的对象?



我有一个对象数组[{createdAt: Date, value: Int}].每天可能会有很多对象添加到数组中。我需要通过每天仅显示一个最后存储的对象来过滤此数组。

例如:

let data = [
{createdAt: new Date("2019-01-01T23:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-01T22:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-01T21:00:00.000Z"), value: 3},
{createdAt: new Date("2019-01-02T20:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-02T02:00:00.000Z"), value: 4},
{createdAt: new Date("2019-01-02T09:00:00.000Z"), value: 3},
];

所需输出 :

let result = [
{createdAt: new Date("2019-01-01T23:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-02T20:00:00.000Z"), value: 1}
];

任何想法如何使它最具成本效益?

以防万一这是我的解决方案:

const rawResult = data.reduce((prevValues, item) => {
let day = item.createdAt.getUTCDate();
let month = item.createdAt.getUTCMonth();
let year = item.createdAt.getUTCFullYear();
let date = day + '/' + month + '/' + year;
if (!prevValues[date] || (prevValues[date].createdAt < item.createdAt)) {
prevValues[date] = item;
}
return prevValues;
}, {});
const result = Object.keys(rawResult).map((date) => {
return rawResult[date];
});
console.log('result: ', result);

由于您的输入未排序,您可以先选择对其进行排序,然后使用Map,按日期部分键控,以获取所需的值。

这假设您希望根据 UTC 时间按天分组(因为您使用该时区显式输入(:

let data = [
{createdAt: new Date("2019-01-01T23:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-01T22:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-01T21:00:00.000Z"), value: 3},
{createdAt: new Date("2019-01-02T20:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-02T02:00:00.000Z"), value: 4},
{createdAt: new Date("2019-01-02T09:00:00.000Z"), value: 3},
];
let result = [...new Map(
data.sort((a,b) => a.createdAt - b.createdAt)
.map(item => [item.createdAt.toJSON().slice(0, 10), item])
).values()];
console.log(result);

let data = [
{createdAt: new Date("2019-01-01T23:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-01T22:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-01T21:00:00.000Z"), value: 3},
{createdAt: new Date("2019-01-02T20:00:00.000Z"), value: 1},
{createdAt: new Date("2019-01-02T02:00:00.000Z"), value: 4},
{createdAt: new Date("2019-01-02T09:00:00.000Z"), value: 3},
];
result=new Map()
data.map(item=>{ 
let dat=item.createdAt.toJSON().slice(0,10)
if(!result.has(dat)){
result.set(dat,item)
}
})

solution=Array.from(result.values())

console.log(solution)

输出:[ { "创建于": "2019-01-01T23:00:00.000Z", "值": 1 }, { "创建于": "2019-01-02T20:00:00.000Z", "值": 1 } ]

尝试使用此包 https://www.npmjs.com/package/lodash 轻松过滤对象数组。

import * as _ from 'lodash';
filterObjectsByDate() {
this.objsFiltered = 
this.allObjectsNunFiltered.filter(g => g.date);
this.objsFiltered = _.chain(this.objsFiltered)
.filter(g => g.date.toString().substring(0, g.date.toString().indexOf('T')) === new Date()) // if u want to filter based on Todays date
.value();
}

最新更新