js 对象数组属性相同的值合并相加
2020-08-06 本文已影响0人
BlinglingSam
对象数组根据某一相同项示例为travelerEmpNum
,合并其他属性为一个数组,主要包括对象数组根据某一相同项合并其他属性为一个数组,为项目需求。
对象数组示例
let rows = [
{
"travelerName":"王晓&陈辰",
"travelerEmpNum":"1001&1002",
"expenseAmountTotal":1381,
"invoiceAmountTotal":1381
},
{
"travelerName":"王晓",
"travelerEmpNum":"1001",
"expenseAmountTotal":100,
"invoiceAmountTotal":100
},
{
"travelerName":"王晓",
"travelerEmpNum":"1001",
"expenseAmountTotal":306,
"invoiceAmountTotal":306
}
],
合并后的结果
[
{
expenseAmountTotal: 1381,
invoiceAmountTotal: 1381,
travelerEmpNum: "1001&1002",
travelerName: "王晓&陈辰",
travelers: " 王晓 | 1001, 陈辰 | 1002",
},
{
expenseAmountTotal: 406,
invoiceAmountTotal: 406,
travelerEmpNum: "1001",
travelerName: "王晓",
travelers: " 王晓 | 1001",
},
]
/ **
* 报账单提交时费用金额检查
*/
async fetchcheckClaimAmount () {
this.claimAmountList = []
let formData = new FormData()
formData.append('claimId', this.editedOriginDetail.claimId)
let res = await this.checkClaimAmount(formData)
if (res.success) {
let list = res.rows
let result = list.reduce((items, item) => { // 将相同员工属性合并
let findData= items.find(arrItem => item.travelerEmpNum === arrItem.travelerEmpNum)
if (findData) {
findData.invoiceAmountTotal += item.invoiceAmountTotal
findData.expenseAmountTotal += item.expenseAmountTotal
} else {
//不要直接在原来的对象修改,新建对象
let newItem = {
expenseAmountTotal: item.expenseAmountTotal,
invoiceAmountTotal: item.invoiceAmountTotal,
travelerEmpNum: item.travelerEmpNum,
travelerName: item.travelerName,
}
items.push(newItem )
}
return items
},[])
// 员工信息处理
result.forEach(item => {
if (item.expenseAmountTotal !== item.invoiceAmountTotal) { // 若发票合计与费用合计进入不同则展示在页面
this.claimAmountList.push(item)
let travelers = ''
if (item.travelerEmpNum.indexOf('&') !== -1) { // 多个员工
let code = item.travelerEmpNum.split('&')
let name = item.travelerName.split('&')
code.forEach((el, i) => {
name.forEach((it, y) => {
if (i === y) {
travelers += ` ${it} | ${el},`
}
})
})
item['travelers'] = travelers.substring(0, travelers.length - 1)
} else { // 一个员工
item['travelers'] = ` ${item.travelerName} | ${item.travelerEmpNum}`
}
}
})
if (this.claimAmountList.length) {
this.checkVisible = true
} else {
this.checkClaimOk()
}
}
},