首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用javascript创建累积对象

使用javascript创建累积对象
EN

Stack Overflow用户
提问于 2018-12-11 03:57:20
回答 2查看 335关注 0票数 0

我有一个日期数组和一个对象数组。每个都有一个日期属性。我需要按日期对对象进行累计排序。因此,对于日期数组中的每个日期,我希望创建一个累积对象,其中包含日期数组中日期之前的每个对象的date属性。

例如,,下面的日期数组和对象数组:

代码语言:javascript
复制
['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'}]

所需的输出是:

代码语言:javascript
复制
[{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万个对象来完成这个任务。

下面是一个当前的代码片段,但是由于迭代对象的数量,我的性能出现了问题。

代码语言:javascript
复制
    _.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;
  });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-11 04:11:11

您可以对日期进行map(),因为您希望每个日期有一个结果数组。然后,在地图中,您可以根据创建数组的日期filter()人员:

代码语言:javascript
复制
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))

票数 2
EN

Stack Overflow用户

发布于 2018-12-11 05:32:54

有几种方法可以在保持关联索引的同时改进算法

  • 预计算日期对象,并仅为peopledates计算它们一次
  • 以升序方式对dates进行排序
  • 重用预计算/预过滤的结果,请参阅动态规划
  • 保存datespeople索引以保持原来的顺序
  • remaininglastChunk之间交换项,以减小remaining大小(如果是people[i].date < dates[j] )

算法代码:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53717170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档