我有一个日期数组和一个对象数组。每个都有一个日期属性。我需要按日期对对象进行累计排序。因此,对于日期数组中的每个日期,我希望创建一个累积对象,其中包含日期数组中日期之前的每个对象的date属性。
例如,,下面的日期数组和对象数组:
['2017-11-5', '2018-3-1', '2018-3-22']
[{name: 'Jes', date: '2017-11-2'}, {name: 'Jill', date: '2018-1-5'}, {name: 'Joe', date: '2018-2-25'}, {name: 'Jack', date: '2018-3-21'}]所需的输出是:
[{name: 'Jes', date: '2017-11-2'}]
[{name: 'Jes', date: '2017-11-2'}, {name: 'Jill', date: '2018-1-5'}, {name: 'Joe', date: '2018-2-25'}]
[{name: 'Jes', date: '2017-11-2'}, {name: 'Jill', date: '2018-1-5'}, {name: 'Joe', date: '2018-2-25'}, {name: 'Jack', date: '2018-3-21'}]我试着用大约500个日期和3万个对象来完成这个任务。
下面是一个当前的代码片段,但是由于迭代对象的数量,我的性能出现了问题。
_.each(dtArray,function(i:Date){
let dt = new Date(i);
let filtered = _.filter(data,function(row){
let dtVal = new Date(row['date']);
return dtVal<=dt;
});发布于 2018-12-11 04:11:11
您可以对日期进行map(),因为您希望每个日期有一个结果数组。然后,在地图中,您可以根据创建数组的日期filter()人员:
let dates = ['2017-11-5', '2018-3-1', '2018-3-22']
let people = [{name: 'Jes', date: '2017-11-2'}, {name: 'Jill', date: '2018-1-5'}, {name: 'Joe', date: '2018-2-25'}, {name: 'Jack', date: '2018-3-21'}]
let cumul = dates.map(d => people.filter(person => person.date <= d))
console.log(JSON.stringify(cumul, null, 2))
发布于 2018-12-11 05:32:54
有几种方法可以在保持关联索引的同时改进算法

people和dates计算它们一次dates进行排序dates和people索引以保持原来的顺序remaining和lastChunk之间交换项,以减小remaining大小(如果是people[i].date < dates[j] )算法代码:
function filter(dates, people){
let lastChunk = [];
let remaining = people;
let results = [];
// precalculate dates, preserve indexes and sort by date
let sortedDates = dates
.map((value, index) => {
return {
date: new Date(value),
index: index
};
})
.sort((a, b) => {
return a.date<b.date?-1:a.date==b.date?0:1;
});
let peopleWithDates = people.map((value, index) => {
value.dateObject = new Date(value.date);
value.index = index;
return value;
});
for(const i in sortedDates){
const comp = sortedDates[i].date
remaining = remaining.filter((value, index) => {
if(value.dateObject<=comp){
let itemIndex = value.index;
delete value.dateObject;
delete value.index;
lastChunk.splice(itemIndex, 0, value);
return false;
}else{
return true;
}
});
results[sortedDates[i].index] = [...lastChunk];
}
return results;
}https://stackoverflow.com/questions/53717170
复制相似问题