首页 > 解决方案 > 节点JS | 根据名称和日期差异对项目进行分组

问题描述

问题陈述

我正在尝试根据我能够做到的公司名称对工作经验进行分组。但是,我只想在它们是连续作业时对它们进行分组。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 位不是连续日期,因此不应将其分组,对此有什么想法吗?如果日期差异超过一个月,我不想分组。

标签: javascriptnode.jsgroup-bylodash

解决方案


在纯粹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);


推荐阅读