前提
在项目中,将后台返回的数据进行对应赋值的时候,遇到深层数据的时候,无法处理。简单的浅拷贝不能满足项目的需要,但是每一个接口的数据单独去处理,就变成了真正的搬砖机器了。希望能写出一个工具类,不仅能处理后台偷懒返null的情况,还能对返回的数据进行对应的二次处理。
一、分析函数的需求
- 传入两个对象,
源对象和目标对象 源对象和目标对象层层匹配,将对应的值一一赋值,若不存在返回''- 传入一个参数来确实保留原始值还是置空,默认如果不存在,保留原始值
- 传入一个
函数 - 函数用来处理
目标对象的数据格式
方法实现
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'
}))
//////////////结果////////////////
{
highEnergyAC: 0
isCalc: ""
lowEnergyAC: ""
}
console.log(assignIterKey(source,target,true,(value , key)=>{
return key != 'isCalc' ? value : value + 'hhh'
}))
//////////////结果////////////////
{
highEnergyAC: 0
isCalc: "1hhh"
lowEnergyAC: 0.804279625415802
}
多层数据匹配
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))
///////////////结果///////////////////////////
适配数组类型
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))
优化
按照上面的写法会改变源数据,我们需要重新声明一个新的变量来保证不修改原来的数据
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
}