在使用echarts 来做统计报表的时候,由于数量较多,准备将同类型的相同属性抽取出来,然后用来做默认属性的。结果发现一个问题。
使用Object.assign
只能复制第一层属性,对于深层的无法复制。
举例:
var object1 = {
title : {
name : 'default',
style : '#49e'
}
};
var option = {
title : {
name : 'test',
size : 22
}
};
var newObject = Object.assign(object1,option);
//我们希望的结果是
{
title : {
name : 'test',
style : '#49e',
size : 22
}
}
//而实际的结果却实
{
title : {
name : 'test',
size : 22
}
}
//只能覆盖第一层属性。
function clone(){
var args = slice.call(arguments);
if(args.length == 0){
return {};
}else if(args.length == 1){
//创造一个新的返回
var source = args[0];
if(typeof source != 'object'){
return source;
}else{
var newTarget = {};
for(var k in target){
newTarget[k] = target[k];
}
return newTarget;
}
}else{
//多个参数
var target = args[0];
var left = args.splice(1);
if(typeof target == 'object'){
var newTarget = {};
//先复制
for(var k in target){
newTarget[k] = target[k];
}
for(var i=0;i<left.length;i++){
var source = left[i];
for(var k in source){
newTarget[k] = clone(newTarget[k],source[k]);
}
}
return newTarget;
}else{
return left[0];
}
}
}
var object = {
title : {
name : 'test'
}
};
var object1 = clone(object);
//克隆出一个新的对象
var object2 = {
title : {
style : '#49e'
}
};
var object3 = clone(object,object2);
//覆盖属性
var object4 = {
title : {
style : '#f60',
size : 22
}
};
var object5 = clone(object,object2,object4);
//多参数,最终是从后向前覆盖
如果对象特别大...有可能会回调溢出吧 。毕竟这是递归处理的。(没有进行测试过呢)
转载请注明出处: https://chrunlee.cn/article/javascript-clone-object.html