节点JS |根据名称和日期差异

时间:2020-06-03 08:18:29

标签: javascript node.js group-by lodash

问题陈述

我正在尝试根据我能做的公司名称来分组工作经验。但是,仅当它们是连续工作时,我才希望将它们分组。 LinkedIn实施了相同的逻辑。 我认为需要一种基于名称和日期差异对项目进行分组的递归方法。 例如

const data = [
    {
        Position: '1'
        CompanyName: 'Microsoft',
        StartDate: '2017-01-01',
        EndDate: '2017-04-01'
    },
    {
        Position: '2'
        CompanyName: 'Microsoft',
        StartDate: '2017-04-01',
        EndDate: '2017-10-01'
    },
        {
        Position: '3'
        CompanyName: 'Amazon',
        StartDate: '2017-10-01',
        EndDate: '2018-02-01'
    },
    {
        Position: '4'
        CompanyName: 'Microsoft',
        StartDate: '2018-03-04',
        EndDate: '2018-10-04'
    }
];

当前,我可以使用以下代码在节点js中按公司名称分组

代码

/** applyGroupByPropName
* @param {Object} data this is the data object
* @param {string} propName This is the property to be grouped
* @returns {Object} returns a grouped object based on prop key
*/
    static applyGroupByPropName(data, propName) {
        if (!_.isNull(data) && !_.isEmpty(data) && data.length > 0) {
            data = _.mapValues(_.groupBy(data, propName),
                clist => clist.map(item => _.omit(item, propName)));
        }
        return data;
 }

当前我的输出是

   [ 
     CompanyName: 'Microsoft': [
     {
        Position: '1'   
        StartDate: '2017-01-01',
        EndDate: '2017-04-01'
    }, {
        Position: '2'
        StartDate: '2017-04-01',
        EndDate: '2017-10-01'
    }, {
        Position: '4'
        StartDate: '2018-03-04',
        EndDate: '2018-10-04'
    }
    ],
      CompanyName: 'Amazon' :
      [
        {
        Position: '3'
        StartDate: '2017-10-01',
        EndDate: '2018-02-01'
       }
      ]
   ]

预期产量

   [ 
     CompanyName: 'Microsoft': [
     {
        Position: '1'   
        StartDate: '2017-01-01',
        EndDate: '2017-04-01'
    }, {
        Position: '2'
        StartDate: '2017-04-01',
        EndDate: '2017-10-01'
    }
    ],
      CompanyName: 'Amazon' :
      [
        {
        Position: '3'
        StartDate: '2017-10-01',
        EndDate: '2018-02-01'
       }
      ],
      CompanyName: 'Microsoft' :
      [
        {
        Position: '4'
        StartDate: '2018-03-04',
        EndDate: '2018-10-04'
       }
      ]
   ]

因此,由于排名4不是连续日期,因此不应将其分组,对此有何想法? 如果日期差超过一个月,我不想分组。

1 个答案:

答案 0 :(得分:1)

在纯JavaScript中,我将与reduce一起执行任务。还请告诉我这是否可以完成所需的任务。

var data = [ { Position: '1', CompanyName: 'Microsoft', StartDate: '2017-01-01', EndDate: '2017-04-01' }, { Position: '2', CompanyName: 'Microsoft', StartDate: '2017-04-01', EndDate: '2017-10-01' }, { Position: '3', CompanyName: 'Sapient', StartDate: '2017-10-01', EndDate: '2018-02-01' }, { Position: '4', CompanyName: 'Microsoft', StartDate: '2018-03-04', EndDate: '2018-10-04' }];

var result = 
data.reduce((acc,{CompanyName, ...rest})=>{
   acc[CompanyName] = acc[CompanyName] || [];
   if(acc[CompanyName].length>0){
     lastEndDt = acc[CompanyName][acc[CompanyName].length-1].EndDate;
     difference = Math.ceil(Math.abs(new Date(lastEndDt)- new Date(rest.StartDate))/(1000 * 60 * 60 * 24));
     if(difference<31){ acc[CompanyName].push(rest) } else { acc[`${CompanyName}_unordered`] =  [...(acc[`${CompanyName}_unordered`] || [] ), rest]};
     } else {
     acc[CompanyName].push(rest);
    }
  return acc;
},{});
console.log(result);

相关问题