[英]how can i filter array of objects by its property value? in Javascript/ React-native
[英]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.