需求:某个对象数组,将其某些属性值相同的对象拿到,然后合并这些对象
举例:有一个数组,其2,3项前9项相同,可以合并。
let excelData = {
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D22030721",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
"接班顺序(0:无,1~N)": 1,
"人才满足策略": "外部招募",
"行动计划": "测试1",
"预计完成时间": 44844,
"pic": "测试1",
"本月进度说明": "测试1",
"实际完成时间": 44844
},
{
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D20070049",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
"接班顺序(0:无,1~N)": 2,
"人才满足策略": "外部招募",
"行动计划": "测试11",
"预计完成时间": 44845,
"pic": "测试11",
"本月进度说明": "测试11",
"实际完成时间": 44845
},
{
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D20070049",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
"接班顺序(0:无,1~N)": 2,
"人才满足策略": "外部招募",
"行动计划": "测试111",
"预计完成时间": 44844,
"pic": "测试111",
"本月进度说明": "测试111",
"实际完成时间": 44844
},
{
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D21051113",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 1,
"接班顺序(0:无,1~N)": 1,
"人才满足策略": "外部招募",
"行动计划": "应该无",
"预计完成时间": 44844,
"pic": "应该无",
"本月进度说明": "应该无",
"实际完成时间": 44844
}
]
方法:使用递归实现
/**
* 对象数组根据多个相同的属性进行合并
* 原理:每次将arr[0]中需要比较相同的属性存入temp,循环arr找出与arr[0]具有相同属性的对象,
* 并push到result中,同时记录相同项的索引,再将arr中改索引的数据删除,以达到去除比对过相同的数据防止多次比对。
* 再次调用本方法,直到arr被删除完,即比对结束,最后返回result
* @param {Array} arr 需要合并数组
* @param {Array} result 返回合并数组
* @return result 返回合并数组
*/
digui(arr,result){
if(arr.length > 0){//判断arr是否海油值
let temp = {//存放基本数据,定义strategyInfo[]存放不同的属性组成的对象
departmentCode:arr[0]['部门代码'],
departmentLevel:arr[0]['岗位层级'],
neck:arr[0]['与上级组织关系(0:一般,1:挂脖子)'],
stationName:arr[0]['岗位名称'],
departmentManagerEmplid:arr[0]['在岗人员工号'],
successorEmplid:arr[0]['接班人工号'],
successionState:arr[0]['接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)'],
successionOrder:arr[0]['接班顺序(0:无,1~N)'],
strategyInfo:[]
}
let indexs = []
for (let i = 0; i < arr.length; i++) {
if(temp.departmentCode == arr[i]['部门代码']&&//比较需要相同的属性
temp.departmentLevel == arr[i]['岗位层级']&&
temp.neck == arr[i]['与上级组织关系(0:一般,1:挂脖子)']&&
temp.stationName == arr[i]['岗位名称']&&
temp.departmentManagerEmplid == arr[i]['在岗人员工号']&&
temp.successorEmplid == arr[i]['接班人工号']&&
temp.successionState == arr[i]['接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)']&&
temp.successionOrder == arr[i]['接班顺序(0:无,1~N)']
){
temp['strategyInfo'].push({//如果满足以上属性相同,则将其他属性装成对象push到准备好数组strategyInfo中
departmentLevel:arr[i]['岗位层级'],
stationName:arr[i]['岗位名称'],
departmentCode:arr[i]['部门代码'],
type:2,
withoutId:'',
strategy:arr[i]['人才满足策略'],
plan:arr[i]['行动计划'],
estimateTime:arr[i]['预计完成时间'],
pic:arr[i]['pic'],
monthlyProgressReport:arr[i]['本月进度说明'],
actualTime:
(Object.prototype.hasOwnProperty.call(arr[i], '实际完成时间'))?
arr[i]['实际完成时间']:'',
})
//记录满足条件的索引,使用unshift不用push(删除时可以从后往前,防止删除前面的引起后面的索引与数据对不上)
indexs.unshift(i)
}
}
//循环删除满足条件的数据(如果上面使用push,这里需要倒序删除)
for (let j = 0; j <indexs.length ; j++) {
arr.splice(indexs[j],1)
}
result.push(temp)//将整理好的一项数据push到result
console.log('indexs',indexs);
console.log('result',result);
this.digui(arr,result)//递归调用,传入处理过的arr和有部分数据的result
}
return result//当arr不>0,即被删完时,说明所有数据都比对完成,此时返回result
},
let excelData = [
{
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D22030721",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
"接班顺序(0:无,1~N)": 1,
"人才满足策略": "外部招募",
"行动计划": "测试1",
"预计完成时间": 44844,
"pic": "测试1",
"本月进度说明": "测试1",
"实际完成时间": 44844
},
{
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D20070049",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
"接班顺序(0:无,1~N)": 2,
"人才满足策略": "外部招募",
"行动计划": "测试11",
"预计完成时间": 44845,
"pic": "测试11",
"本月进度说明": "测试11",
"实际完成时间": 44845
},
{
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D20070049",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
"接班顺序(0:无,1~N)": 2,
"人才满足策略": "外部招募",
"行动计划": "测试111",
"预计完成时间": 44844,
"pic": "测试111",
"本月进度说明": "测试111",
"实际完成时间": 44844
},
{
"部门代码": "KDLP10",
"岗位层级": "非課級",
"与上级组织关系(0:一般,1:挂脖子)": 0,
"岗位名称": "前端",
"在岗人员工号": "D14080045",
"副手工号": "D22070528",
"接班人工号": "D21051113",
"接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 1,
"接班顺序(0:无,1~N)": 1,
"人才满足策略": "外部招募",
"行动计划": "应该无",
"预计完成时间": 44844,
"pic": "应该无",
"本月进度说明": "应该无",
"实际完成时间": 44844
}
]
let arr = JSON.parse(JSON.stringify(excelData))
console.log('excelData',excelData);
let result = this.digui(arr,[])
console.log('result',result);