问题陈述
我正在尝试根据我能做的公司名称来分组工作经验。但是,仅当它们是连续工作时,我才希望将它们分组。 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不是连续日期,因此不应将其分组,对此有何想法? 如果日期差超过一个月,我不想分组。
答案 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);