根据特定规则生成合并数据,遍历循环时会存在数据错乱等情况的问题排查(深拷贝 仅自己记录)

文章讨论了一个在处理领料单合并时遇到的问题,涉及到批次和数量不同的物料如何生成主单据,以及如何进行对象和数组的深拷贝以避免数据混乱。正确代码使用`JSON.parse(JSON.stringify())`和扩展运算符实现深拷贝。
摘要由CSDN通过智能技术生成

问题前景

在合并生成领料单,选择相同物料,合并领料,但因批次,数量不一样,需要单独生成一个主单据下面显示具体的物料,主单据的数量必须是选择单据的数量累加
两个相同的子件编码,点击合并领料,由前端生成一个主单据
由前端生成的单据,现在数量是正确的

错误代码演示

 const temp = JSON.parse(JSON.stringify(this.lydata.orderProdPbmList))
    const dataList = temp
    const obj = {}
    const peon = temp.reduce((cur, next) => {
      if (obj[next.materialCode]) {
        console.log('obj[next.materialCode]', next.planQty)
      } else {
        obj[next.materialCode] = true && cur.push(next)
      }
      return cur
    }, [])
    peon.forEach(item => {
      let sum = 0
      const children = []
      dataList.forEach(e => {
        if (item.materialCode === e.materialCode) {
          sum += e.planQty - e.lockQty
          children.push(e)
        }
      })
      item.children = children
      item.totalQty = sum
    })
    this.mergeListShow = peon
  

代码导致的数据错误

正确代码

 const temp = JSON.parse(JSON.stringify(this.lydata.orderProdPbmList))
    const dataList = [...temp]
    const obj = {}
    const peon = temp.reduce((cur, next) => {
      if (obj[next.materialCode]) {
        console.log('obj[next.materialCode]', next.planQty)
      } else {
        obj[next.materialCode] = true && cur.push(next)
      }
      return cur
    }, [])
    peon.forEach(item => {
      let sum = 0
      const children = []
      dataList.forEach(e => {
        if (item.materialCode === e.materialCode) {
          sum += e.planQty - e.lockQty
          children.push({ ...e })
        }
      })
      item.children = children
      item.totalQty = sum
    })
    this.mergeListShow = peon

问题:引用的问题,引用了地址。数组和对象的深拷贝

在这里插入图片描述

children.push({ ...e })//对象深拷贝
const temp = JSON.parse(JSON.stringify(this.lydata.orderProdPbmList))
    const dataList = [...temp]//数组深拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值