克隆javascript纯对象

克隆javascript纯对象

BUG集散地

2018-09-11 08:39 阅读 60 喜欢 0 对象克隆 深度克隆

背景

在使用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
  }
}
//只能覆盖第一层属性。

自己动手实现clone

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


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
需求如下:有一张大图,需要显示大图中的一小部分,目前能知道的时候小图的宽高和坐标,同时大图有一个旋转角度可以知道,目标就是把小图正确的显示出来。
codewars上的一个题目,这里记录下解决方法。
突然来了一个调研任务,想要实现一个类似3D虚拟展厅类似的需求,主要就是放一些学生的作品,然后预览啥的,效果还是要全景的效果。 经过一番调查,最终锁定了以前从未接触过的krpano。
之前一直没面试过前端,今天有一个,先整理下需要问的问题和答案。这里都是一些简单的问题,关于当下比较流行的框架并没有涉及到..
做作业的时候,需要在手机上预览下,但是发现如果想在移动端上展示A4样子的作业还是挺麻烦的,最后还是准备通过图片来展示,然后移动端缩放呗。。
现象:在IOS中,jsp页面绑定的点击事件,点击后延迟很大,接近1000ms,反应很慢
java 对象中有很多引用,甚至会出现循环引用,比如 user 对象中有 school 对象,school 对象中又有 user 对象,这样在对 user 对象序列化的时候,就会出现死循环,导致内存溢出。通过一定的方式,将每个对象增加ID 和 REF 引用标识最终可以解决这个问题
我们经常会有判断一个数值是素数的需求,那么我们如何来实现呢?