javascript - 节点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 位不是连续日期,因此不应将其分组,对此有什么想法吗?如果日期差异超过一个月,我不想分组。
解决方案
在纯粹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);
推荐阅读
- ssh - 如何抑制“被信号 1 杀死”。ssh 跳转连接错误
- sql - 相同的查询,相同的服务器,不同的数据库查询运行超慢
- jupyter-notebook - 通过 Jupyter notebook 恢复已删除的文件
- hadoop - 如果为 yarn cgroups 运行许多线程,CPU 限制公式仍然有效吗?
- c# - Selenium 通过 Data-Qa 属性查找元素
- sql-server - 无法将表更改为数据库所有者
- c# - 如何在启用 ASP.NET Core 2.2 EndpointRouting 的情况下使用 RouteDataRequestCultureProvider?
- c# - 使用绝对路径时找不到程序集
- javascript - 如何在 JavaScript / Java 中实现 IDCT(JPEG 压缩)?
- angular - 禁止在同一表单字段中单击按钮时选择打开