工具类-数据自动赋值

106 阅读3分钟

前提

在项目中,将后台返回的数据进行对应赋值的时候,遇到深层数据的时候,无法处理。简单的浅拷贝不能满足项目的需要,但是每一个接口的数据单独去处理,就变成了真正的搬砖机器了。希望能写出一个工具类,不仅能处理后台偷懒返null的情况,还能对返回的数据进行对应的二次处理。

风车.png

1676614419432.jpg

一、分析函数的需求

  • 传入两个对象,源对象目标对象
  • 源对象目标对象层层匹配,将对应的值一一赋值,若不存在返回''
  • 传入一个参数来确实保留原始值还是置空,默认如果不存在,保留原始值
  • 传入一个函数
  • 函数用来处理目标对象的数据格式

风车.png方法实现

1.处理基本功能

export function assignIterKey( source= {},target = {},isPreserve = true , fn ){
  /** 
   * source:源数据
   * target:目标数据
   * isPreserve:数据为空时候,是否保留原来数据的值
   * fn : 数据处理函数
  */
   //判断null 或者 数据格式不匹配
  if(Object.prototype.toString.call(source) !== Object.prototype.toString.call(target)){
      console.error("源数据和目标数据格式不匹配")
      return false
  }
  let _source = {}
 
  //赋值逻辑
  for(let item in source){
    let _new = target[item]
    if((_new ?? "") === ""){
      _new = isPreserve ? source[item] : ""
    }
    if(_new !== "" && fn && (typeof fn === 'function')){
      _new = fn(_new,item)
    }
    _source[item] = _new
  }
  return _source
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

let  source = {
  "highEnergyAC": 0.8570958971977234,
  "isCalc": 1,
  "lowEnergyAC": 0.804279625415802
}
let target = {
  "highEnergyAC": 0,
}
console.log(assignIterKey(source,target,false,(value , key)=>{
  return key != 'isCalc' ? value : value + 'hhh'
}))

//////////////结果////////////////

{
  highEnergyAC0
  isCalc""
  lowEnergyAC""
}

console.log(assignIterKey(source,target,true,(value , key)=>{
  return key != 'isCalc' ? value : value + 'hhh'
}))

//////////////结果////////////////

{
  highEnergyAC0
  isCalc"1hhh"
  lowEnergyAC0.804279625415802
}

风车.png多层数据匹配

export function assignIterKey( source= {},target = {},isPreserve = true , fn ){
  if(Object.prototype.toString.call(source) !== Object.prototype.toString.call(target)){
      console.error("源数据和目标数据格式不匹配")
      return false
  }
  for(let item in source){
    if(Object.prototype.toString.call(source[item]) ===  "[object Object]"){
      assignIterKey(source[item],target[item] || {} ,isPreserve , fn )
    }else{
      let _new = target[item]
      if((_new ?? "") === ""){
        _new = isPreserve ? source[item] : ""
      }
      if(_new !== "" && fn && (typeof fn === 'function')){
        _new = fn(_new,item)
      }
      source[item] = _new
    }

  }
  return source
}

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

let source = [{
  "gas": {
    "highEnergyAC": 0.8570958971977234,
    "isCalc": 1,
    "lowEnergyAC": 0.804279625415802
  },
  "oil": {
    "highEnergyAC": 0.8570958971977234,
    "isCalc": 1,
    "lowEnergyAC": 0.804279625415802
  }
}]
let target = [{
  "gas": {
    "highEnergyAC":222222,
    "isCalc": 33333,
    "lowEnergyAC": 111
  }
}]
console.log(assignIterKey(source,target,true))


///////////////结果///////////////////////////


1676455546313.jpg

风车.png适配数组类型

export function assignIterKey( source= {},target = {},isPreserve = true , fn ){
  if(Object.prototype.toString.call(source) !== Object.prototype.toString.call(target)){
      console.error("源数据和目标数据格式不匹配")
      return false
  }
  if(Object.prototype.toString.call(source) ===  "[object Array]"){
    if(source.length === 0) return[]
    source.map((item,index) => {
      assignIterKey(item,target[index],isPreserve,fn)
    })
  }else {
    for (let item in source) {
      if (Object.prototype.toString.call(source[item]) === "[object Object]") {
        assignIterKey(source[item], target[item] || {}, isPreserve, fn)
      } else if (Object.prototype.toString.call(source[item]) === "[object Array]") {
        if(source[item].length === 0) return[]
        source[item].map((s,index) => {
          assignIterKey(s, target[index] || {}, isPreserve, fn)
        })

      }else{
        let _new = target[item]
        if ((_new ?? "") === "") {
          _new = isPreserve ? source[item] : ""
        }
        if (_new !== "" && fn && (typeof fn === 'function')) {
          _new = fn(_new, item)
        }
        source[item] = _new
      }

    }
  }
  return source
}

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

let source = [{
  "gas": {
    "highEnergyAC": 0.8570958971977234,
    "isCalc": 1,
    "lowEnergyAC": 0.804279625415802
  },
  "oil": {
    "highEnergyAC": 0.8570958971977234,
    "isCalc": 1,
    "lowEnergyAC": [{
      label:2,
      value:5555
    }]
  }
}]
let target = [{
  "gas": {
    "highEnergyAC":222222,
    "isCalc": 33333,
    "lowEnergyAC": 111
  }
}]
console.log(assignIterKey(source,target,false))

1676456273148.jpg

风车.png优化

按照上面的写法会改变源数据,我们需要重新声明一个新的变量来保证不修改原来的数据

export function assignIterKey( source= {},target = {},isPreserve = true , fn ){
  let newVar ;
  if(instansceObject(source) !== instansceObject(target)){
      console.error("源数据和目标数据格式不匹配")
      return false
  }
  if(instansceObject(source) ===  "Array"){
    if(source.length === 0) return[]
    newVar = []
    source.map((item,index) => {
      newVar.push(assignIterKey(item,target[index],isPreserve,fn))
    })
  }else {
    newVar = {}
    for (let item in source) {
      if (instansceObject(source[item]) === "Object") {
        newVar[item] = assignIterKey(source[item], target[item] || {}, isPreserve, fn)
      } else if (instansceObject(source[item]) === "Array") {
        newVar[item] = []
        if(source[item].length === 0) return[]
        source[item].map((s,index) => {
          newVar[item].push(assignIterKey(s, target[index] || {}, isPreserve, fn))
        })
      }else{
        let _new = target[item]
        if ((_new ?? "") === "") {
          _new = isPreserve ? source[item] : ""
        }
        if (_new !== "" && fn && (typeof fn === 'function')) {
          _new = fn(_new, item)
        }
        newVar[item] = _new
      }

    }
  }
  return newVar
}