我想在javascript中深度复制一些对象,这样我的reducer在redux中就是纯的。有些属性有1层嵌套,有些属性有2层嵌套,有些属性有3层嵌套,例如:
var x = {a:9}, y:{a:{b:9}}, z = {a:{b:{c:9}}};所以我应该使用一些其他的技术,比如:
var newX = {...x}, newY = {a:{...y.a}}我应该继续在循环中使用相同的技术--也为3层嵌套编写我的自定义深度副本,或者我应该简单地使用:
var newZ = JSON.parse(JSON.stringify(z));来创建我的深度副本。
JSON.parse(JSON.stringify(Value))最快的替代方法是什么??
发布于 2018-11-10 12:03:53
如果您真的想要深度克隆,根据我的经验,到目前为止性能最好的方法是您已经提到的JSON解析/stringify技巧。
否则,您将不得不退回到某种递归克隆策略。以Lodash has a deepClone function为例。
作为深度克隆的替代方案,我强烈推荐immer,它利用了一种称为结构共享的概念,在这种概念中,对象的未更改部分不会被克隆。这是更高的性能和使用更少的内存。
发布于 2018-11-10 12:54:22
我使用在StackOverflow上的某个地方找到的函数:
const deepCopy = origin => {
let cp;
switch (typeof origin) {
case 'object':
if (origin === null) {
cp = null;
} else {
switch (toString.call(origin)) {
case '[object Array]':
cp = origin.map(deepCopy);
break;
case '[object Date]':
cp = new Date(origin);
break;
case '[object ReqExp]':
cp = new RegExp(origin);
break;
default:
cp = Object.keys(origin).reduce((prev, key) => {
prev[key] = deepCopy(origin[key]);
return prev;
}, {});
break;
}
}
break;
default:
cp = origin;
}
return cp;
}https://stackoverflow.com/questions/53235802
复制相似问题