繁体   English   中英

如何通过其 Date 属性过滤对象数组,每天仅显示最后存储的对象?

[英]How can I filter an array of objects by its Date property showing only last stored objects per each day?

我有一个对象数组[{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);

尝试使用此包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();
}

 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)

输出: [ { "createdAt": "2019-01-01T23:00:00.000Z", "value": 1 }, { "createdAt": "2019-01-02T20:00:00.000Z", "value": 1}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM