Javascript 使用object.fromEntries()深度克隆对象

Javascript 使用object.fromEntries()深度克隆对象,javascript,arrays,json,object,ecmascript-6,Javascript,Arrays,Json,Object,Ecmascript 6,不久前,我读到了一些浏览器的新版本()支持的新方法的建议。在阅读这篇文章时,我想到了用这个方法来深度克隆一个对象,而不是使用JSON.parse(JSON.stringify(obj))。到目前为止,我已经提出了下一种递归方法,从我的角度来看,这种方法似乎是可行的 const obj={ key1:{key11:“key11”,key12:“key12”,key13:{key131:22}, key2:{key21:“key21”,key22:“key22”}, 键3:“键3”, 键4:[1,

不久前,我读到了一些浏览器的新版本()支持的新方法的建议。在阅读这篇文章时,我想到了用这个方法来
深度克隆
一个
对象
,而不是使用
JSON.parse(JSON.stringify(obj))
。到目前为止,我已经提出了下一种递归方法,从我的角度来看,这种方法似乎是可行的

const obj={
key1:{key11:“key11”,key12:“key12”,key13:{key131:22},
key2:{key21:“key21”,key22:“key22”},
键3:“键3”,
键4:[1,2,3,4]
}
const cloneObj=(obj)=>
{
if(对象类型!=“对象”)
返回obj;
else if(Array.isArray(obj))
返回obj.slice();
返回Object.fromEntries(Object.entries(obj.map(
([k,v])=>([k,cloneObj(v)])
));
}
//克隆原始对象。
设newObj=cloneObj(obj);
//对原始对象进行更改。
obj.key1.key11=“测试”;
obj.key3=“测试”;
obj.key1.key13.key131=“测试”;
对象键4[1]=“测试”;
//在控制台上显示这两个对象。
log(“原始对象:”,obj);
log(“克隆对象:”,newObj)
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装{最大高度:100%!重要;顶部:0;}
您缺少一件事:

else if (Array.isArray(obj))
  return obj.slice();
这将返回数组的浅层副本。如果阵列包含对象,则不会克隆这些基础对象:

const obj=[
['foo']
];
const cloneObj=(obj)=>
{
if(对象类型!=“对象”)
返回obj;
else if(Array.isArray(obj))
返回obj.slice();
返回Object.fromEntries(Object.entries(obj.map(
([k,v])=>([k,cloneObj(v)])
));
}
//克隆原始对象。
设newObj=cloneObj(obj);
//对原始对象进行更改。
obj[0][0]=‘bar’;
//在控制台上显示这两个对象。
log(“原始对象:”,obj);
log(“克隆对象:”,newObj)
.as控制台{背景色:黑色!重要;颜色:石灰;}
.作为控制台包装{最大高度:100%!重要;顶部:0;}
  • 深度克隆很好,因为深度嵌套的对象仍然保留其属性-但是,数组也需要克隆;将
    obj.slice()
    替换为
    obj.map(o=>cloneObj(o))
  • 这种方法实际上比
    JSON.parse(JSON.stringify(obj))
    快——对和
    JSON
    的三次测试每次都慢10%以上

  • 如前所述,数组不是深度克隆的-请使用
    obj.map(cloneObj)
    而不是
    obj.slice()


    但另一个疏忽是对象的类型“对象”
    ,它不适用于
    null
    。更好地使用对象(obj)!=obj

    您在哪个浏览器上运行检查
    cloneObj
    在Chrome73上运行速度明显更快,但不幸的是,我没有安装FF 63。它可能依赖于实现。我在最新的Chrome@CertainPerformance(
    Object.fromEntries
    在Safari上不起作用)上运行了它。也感谢您的帮助。我真的不太相信性能,因为线程的存在说明
    JSON.parse()
    JSON.stringify()
    更好。不过,很高兴知道它可以工作。谢谢你的帮助,我确信我错过了一些重要的事情!谢谢你的贡献!