问题
我的需求是拿到的数据是这样的一个数组,要把里面的每个对象转化成以下的对象方式
拿到的数据
rows:[
{
cardBgCode: ""
cardStyleCode: ""
cardType: "1"
companyAddress: ""
companyAttestationFlag: ""
companyEmail: ""
companyFax: ""
companyId: ""
companyInfoId: "986682027048701954"
companyIntroduction: ""
companyLogo: ""
companyName: "shenzhen"
companyPost: ""
companyTel: ""
companyWxPic: ""
createTime: "2022-06-15 17:22:07"
createUser: "986211014729011200"
id: "986682027048701953"
personInfoId: "986682027048701952"
status: "1"
updateTime: "2022-06-15 17:22:07"
userAddress: ""
userAttestationFlag: ""
userEmail: ""
userHeadPic: ""
userMobile: ""
userName: ""
userWxPic: ""
},
]
转换成以下形式
info:{
cardType: "",
companyHonorWallIds: "",
companyInfoDto: {
cardBgCode: "",
cardStyleCode: "",
companyAddress: "",
companyFax: "",
companyId: "",
companyIntroduction: "",
companyName: "",
companyPost: "",
companyTel: "",
},
companyProductIds: "",
companySeniorityIds: "",
id: "",
personEduExpIds: "",
personInfoDto: {
userAddress: "",
userEmail: "",
userHeadPic: "",
userMobile: "",
userName: "",
userWxPic: ""
},
personIntroductionIds: "",
personJobExpIds: ""
},
于是我写了个循环遍历对应字段,字段名相等赋值,一切都很正常,但是最后循环出来的结果,每一个都是一样的数据,很不解,最后找了我老大,原来的没有深度拷贝,每次循环的时候都被修改成最新的值,最后循环的数据都是一样的
解决方案
fiedMap(arr) {
// 字段映射
let target = {
cardType: "",
companyHonorWallIds: "",
companyInfoDto: {
cardBgCode: "",
cardStyleCode: "",
companyAddress: "",
companyFax: "",
companyId: "",
companyIntroduction: "",
companyName: "",
companyPost: "",
companyTel: "",
},
companyProductIds: "",
companySeniorityIds: "",
id: "",
personEduExpIds: "",
personInfoDto: {
userAddress: "",
userEmail: "",
userHeadPic: "",
userMobile: "",
userName: "",
userWxPic: ""
},
personIntroductionIds: "",
personJobExpIds: ""
};
let newArr = [];
// 循环数组
for (let k = 0; k < arr.length; k++) {
let newtarget = JSON.parse(JSON.stringify(target)); //深复制,避免改变源数据
// 单个数组对象
for(let key in arr[k]) {
let arrkey = key;
let arrkeyVal = arr[k][arrkey];
// 对比字段名进行映射
for (let j in newtarget) {
if (Object.prototype.toString.call(newtarget[j]) === '[object Object]') {
for (let newtargetkey in newtarget[j]) {
let keys = newtargetkey;
let keysVal = newtarget[j][keys];
if (keys == arrkey) {
newtarget[j][keys] = arrkeyVal;
}
}
} else {
if (j == arrkey) {
newtarget[j] = arrkeyVal;
}
}
}
};
newArr.push(newtarget)
};
return newArr;
}
let newtarget = JSON.parse(JSON.stringify(target)); //深复制,避免改变源数据
原理
js区分栈和堆的概念
其中6种常用类型可以这样区分
基本类型:字符串String,布尔值Boolean,数字Number,可以归为栈
当var a = 13;var b =13;虽然值相等,但是栈中指针的指向是不同的
可以使用new创建基本类型时,就会是属于堆区
对象、数组、函数,归为堆
当创建两个数组,但是字段是一样的,会指向同一个指针,于是在循环中,值被改变但是指向的同一个指针,就只保留最新的值