首页 > 解决方案 > 使用 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'}]

所需的输出将是:

[{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 个日期和 30,000 个对象来做到这一点。

这是当前的代码片段,但由于我正在迭代的对象数量,我遇到了性能问题。

    _.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;
  });

标签: javascriptarrayssortingdatefor-loop

解决方案


您可以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))


推荐阅读