关于for循环给数组添加数据时覆盖问题

88 阅读1分钟

记录工作中遇到的问题一二

有问题的

let replySuppliers = res.Result.ReplySuppliers
let origins = res.Result.Origins

for(let j= 0,len = replySuppliers.length;j<len;j++) {
  let p = replySuppliers[j]
  p.origins = origins
  for(let i = 0,len = p.origins.length;i<len;i++) {
    let origin = origins[i]
    origin.checked = false
    origin.canCheckPartCount = 0
  }
  p.checkedOrigins = []
  p.compareTotalPrice = 0 // 已选总计
  for(let k= 0,len = p.ReplyParts.length;k<len;k++) {
    let part = p.ReplyParts[k]
    for(let i = 0,len = part.ReplyPrices.length;i<len;i++) {
      part.ReplyPrices[i].checked = false // 每个配件里的价格默认为非选中
      // 如果价格不等于0则可以选中的配件数+1
      if(part.ReplyPrices[i].Price != 0) {
        p.origins[i].canCheckPartCount += 1
      }
    }
  }
}

目的是给每个供应商赋值一个品质列表(Origins,后端返回与ReplySuppliers同级),结果发现赋值时循环到下一个供应商会把上一个供应商的origins覆盖掉,对origins操作时两边会同步更新数据(联想到赋值和浅拷贝问题)

解决后的

定义一个临时来接收这个res.Result.Origins,循环拿到需要用到的字段,用供应商的索引j来动态命名变量再进行赋值

let replySuppliers = res.Result.ReplySuppliers
let origins = res.Result.Origins

for(let j= 0,len = replySuppliers.length;j<len;j++) {
  let p = replySuppliers[j]
  let tempOriginsArr = []
  let tempOriginsObj = {}
  for(let i = 0,len = origins.length;i<len;i++) {
    let origin = origins[i]
    let obj = {
      Origin: origin.Origin,
      checked: false,
      canCheckPartCount: 0
    }
    tempOriginsArr.push(obj)
  }
  tempOriginsObj['origin'+j] = tempOriginsArr
  p.origins = tempOriginsObj['origin'+j]
  p.checkedOrigins = []
  p.compareTotalPrice = 0 // 已选总计
  for(let k= 0,len = p.ReplyParts.length;k<len;k++) {
    let part = p.ReplyParts[k]
    for(let i = 0,len = part.ReplyPrices.length;i<len;i++) {
      part.ReplyPrices[i].checked = false // 每个配件里的价格默认为非选中
      // 如果价格不等于0则可以选中的配件数+1
      if(part.ReplyPrices[i].Price != 0) {
        p.origins[i].canCheckPartCount += 1
      }
    }
  }
}