JavaScript之复杂对象的深拷贝(完全深拷贝)
由于网上很多的深拷贝大都有如下问题:
1.灵活性。不能应对复杂对象(复杂对象是指:单一数组对象、多数组对象、多非数组对象、单一对象组合形成的复杂对象)的灵活拷贝
2.不变性。即 拷贝的对象与原对象的结构发生了变化(尤其是:将数组对象经过拷贝后人为变成了非数组对象),破坏了结构并不是深拷贝的初衷。
依据上述问题,花费了三个小时左右的思考和调试,得以解决。
声明:如需读者记录笔记或者摘要时,请声明引用出处,以尊重劳动成果~,谢谢,当然也可以向博主提出意见~
//判断是否为字符串
//返回类型:
//{baseType:typeof(arg),numberType:'int','float',-1}
function numberType(arg){
var baseType;
var numberType;
var regx_int = /^[0-9]*[1-9][0-9]*$/;
if(!isNaN(arg)){//JavaScript中,属于数值的有:数值型字符串和真实数值
baseType = typeof(arg);//输出:string or number
if(regx_int.test(arg)){//整数
numberType = "int";
} else {
numberType = "float";
}
} else {
baseType = typeof(arg);
numberType = -1;
} return {
"arg":arg,
"baseType": baseType,//注意:typeof(stringNumber):string
"numberType": numberType
}
}
/*
console.log(numberType("23")); //{arg: "23", baseType: "string", numberType: "int"}
console.log(numberType("23.0"));//{arg: "23.0", baseType: "string", numberType: "float"}
console.log(numberType("23a")); //{arg: "23a", baseType: "string", numberType: -1}
console.log(numberType(23)); //{arg: 23, baseType: "number", numberType: "int"}
console.log(numberType(23.0)); //{arg: 23, baseType: "number", numberType: "int"}
*/ //url:[js中的深拷贝和浅拷贝](http://www.jianshu.com/p/70dc5b968767)
//依赖:recursion(obj, data)
function cloneDeep(obj){ if( typeof obj !== 'object' || Object.keys(obj).length === 0 ){
return obj
} let resultData;
if( typeof obj == 'object' && (obj instanceof Array))
resultData = [];
else {
resultData = {};
} return recursion(obj, resultData)
} //url:[js中的深拷贝和浅拷贝](http://www.jianshu.com/p/70dc5b968767)
//被依赖:cloneDeep(obj)
//依赖:numberType(num)
function recursion(obj, data = {}){
// console.log('[recursion] data:"' + data + '"; execute: obj:', obj);
for(key in obj){//注意:使用for Each遍历时,会将数值转型为string类型
// console.log('cur:' + obj + '[' + key + ']:', obj[key]);
if( (typeof obj[key] == 'object') && (obj[key] instanceof Array) && Object.keys(obj[key].length > 0 )){
// console.log('key[' + key + '] is Array:', obj[key]);
var array = new Array();
for(var i = 0, size = obj[key].length; i < size; i++){
(function(index){
array.push((obj[key][index]));
})(i)
}
data[key] = array;
// console.log('data[key] data:', data[key]);
}
else if( (typeof obj[key] == 'object') && (!(obj[key] instanceof Array)) && Object.keys(obj[key].length > 0 )){
// console.log('key[' + key + '] is Object but not Array:', obj[key]);
data[key] = recursion(obj[key], {});
// console.log('data[key] data:', data[key]);
} else {
// console.log('key[', key, '] is not object, ','key is ',typeof(key), ', obj[key]:' + obj[key] + ' is ',typeof(key));
var nType = numberType(key);
if(nType.baseType == "string"){//由于forEach的原因,所有的key都是字符串或者对象
// console.log('* nType:', nType);
// console.log('* data.push(obj[key]):', data.push(obj[key]));
// console.log('* obj[key] instanceof Array:', obj[key] instanceof Array);
if(nType.numberType == -1){//如果是真实的字符串或者非数值类型(即 非数值字符串或 真实数值类型),则说明是对象的一个属性
data[key] = obj[key];
} else {//反之:该属性为真实数值类型,说明key作为数组的(下标)键值
data.push(obj[key]);
// console.log('test obj[key]:', obj[key]);
}
}
data[key] = obj[key];//实际上,此处无过多实际意义和用意
// console.log('data[ ' + key +' ] data:', data[key]);
}
// console.log('___________________________________[data]_________________________:', data);//test:遍历一次时,查看当前拷贝对象data的状态
}
return data;
}
使用方式与测试:
var courses = [{"name":"面向对象分析与设计","week_index":1,"course_index":[2,3],"week_start":5,"week_end":16,"teacher":"王敏","location":"6B-108多媒体286座(2017-2018-2)-150905319-0120030135-1"}];
// typeof(courses);
newCourses = recursion(courses, []); studentCourses = cloneDeep(student); console.log(studentCourses,newCourses);
效果:
JavaScript之复杂对象的深拷贝(完全深拷贝)的更多相关文章
- javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法
前言 for,slice(0),concact() 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示: 如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不 ...
- Java对象的浅拷贝和深拷贝&&String类型的赋值
Java中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.方法传参或返回值时,会有值传递和引用(地址)传递的差别. 浅拷贝(Shallow Copy): ①对于数据类型是 ...
- Python中的可变对象与不可变对象、浅拷贝与深拷贝
Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...
- JAVA中对象的克隆及深拷贝和浅拷贝
使用场景: 在日常的编程过程 中,经常会遇到,有一个对象OA,在某一时间点OA中已经包含了一些有效值 ,此时可能会需一个和OA完全相对的新对象OB,并且要在后面的操作中对OB的任何改动都不会影响到OA ...
- 面试题常考&必考之--js中的对象的浅拷贝和深拷贝(克隆,复制)(下)
这里主要是讲深拷贝: 深拷贝:个人理解就是拷贝所有的层级 1.像对象里再放数组和对象这些叫引用值.开始我们先判断大对象中是否有引用值(数组和小对象), 然后在判断引用值是数组还是对象 2.开始啦: 1 ...
- javascript中的对象拷贝
js中的数据类型 在介绍javascript中的对象的拷贝之前,我先介绍一个基础的东西,javascript中的数据类型. 我们做前端的应该都知到在es6 之前,javascript中的数据类型Boo ...
- javascript是判断对象是否是数组
JS中的数据类型: 2大类 原始类型:值保存在变量本地的数据类型 5种:Number String Boolean undefined null Number:8bytes 舍入误差-->四舍五 ...
- JavaScript 基础回顾——对象
JavaScript是基于对象的解释性语言,全部数据都是对象.在 JavaScript 中并没有 class 的概念,但是可以通过对象和类的模拟来实现面向对象编程. 1.对象 在JavaScript中 ...
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- Javascript 中判断对象为空
发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是 ...
随机推荐
- node 和npm 版本更新
node 版本更新 由于公司要用NG-ZORRO,于是我就跑到官网先看看demo,怎么构建项目,执行的过程中发现了问题 问题描述 执行官网构建项目命令 安装脚手架工具# $ npm install - ...
- Nginx PREACCESS阶段 如何限制每个客户端的并发连接数
L:55 nginx.conf配置文件列子 limit_conn_zone $binary_remote_addr zone=addr:10m; #这里根据用户IP地址作为key做限制 并且名称为ad ...
- NVIDIA面目生成器再做突破
导读 NVIDIA创建的AI系统“GAN”可以通过对图像数据库的学习,来随机生成超逼真人脸照片而一炮走红,经过长时间的研发与晚上目前这套系统已经有了极大的进步.除了可以自主学习之外,生成的内容逼真,让 ...
- docker --Dockerfile--一些语法
环境更换 环境变量(与声明的ENV声明),也可以在特定指令作为变量用来被解释 Dockerfile.转义也被处理,从字面上包含类似于变量的语法. 环境变量Dockerfile用 $variable_n ...
- BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP
题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...
- lightoj1038(数学期望dp)
题意:输入一个数N,N每次被它的任意一个因数所除 变成新的N 这样一直除下去 直到 N变为1 求变成1所期望的次数 解析: d[i] 代表从i除到1的期望步数:那么假设i一共有c个因子(包括1和本身) ...
- Leetcode 20.有效的括号 By Python
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...
- cf786E ALT (最小割+倍增优化建图)
如果把“我全都要”看作是我全不要的话,就可以用最小割解决啦 源点S,汇点T 我们试图让每个市民作为一个等待被割断的路径 把狗狗给市民:建边(S,i,1),其中i是市民 把狗狗给守卫:建边(j,T,1) ...
- Windows 10更新时出现0x80070422错误
Windows更新 更新状态 安装更新时出现一些问题,但我们稍后会重试.如果你继续看到此错误,并想要搜索Web或联系支持人员以获取相关信息,一下信息可能会对你有帮助:(0x80070422) 分析原因 ...
- A1081. Rational Sum
Given N rational numbers in the form "numerator/denominator", you are supposed to calculat ...