深度拷贝问题

问题

我的需求是拿到的数据是这样的一个数组,要把里面的每个对象转化成以下的对象方式
拿到的数据

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创建基本类型时,就会是属于堆区
在这里插入图片描述

对象、数组、函数,归为堆
当创建两个数组,但是字段是一样的,会指向同一个指针,于是在循环中,值被改变但是指向的同一个指针,就只保留最新的值
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值