纵横研究院VU...纵横研究院React技术专题社区

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()
        }
      }
    },
上一篇 下一篇

猜你喜欢

热点阅读