有一个任务
默认情况下实现和导出一个执行对象深层复制的函数。
const data = {
key: 'value',
key2: {
key: 'innerValue',
innerKey: {
anotherKey: 'anotherValue',
},
},
};
以及测试条件:
// result имеет такую же структуру, как и data
const result = cloneDeep(data);
// Но внутри другие объекты
result.key2 !== data.key2; // true
result.key2.innerKey !== data.key2.innerKey; // true
解决方案
const data = {
key: 'value',
key2: {
key: 'innerValue',
innerKey: {
anotherKey: 'anotherValue',
},
},
};
const cloneDeep = obj => {
const clone = {};
const values = Object.values(obj);
for (const value of values) {
if ((typeof value) === 'object') {
Object.assign(clone, obj);
cloneDeep(value);
} else {
Object.assign(clone, obj);
}
}
return clone;
}
const result = cloneDeep(data);
console.log(result);
也就是说,我通过更改接收对象中的值而不影响原始对象,得到一个完全隔离的对象。
但是在检查条件时,我得到“假”。还是应该从字面上理解“但里面还有其他物体”?. 当相应地更改值时,我得到“真”。
上面的函数
cloneDeep
不做深拷贝。事实上,它的调用减少到一个调用Object.assign
。克隆的对象与 一起返回
return
,但除了第一次调用外,返回值总是被忽略。相反,它应该已写入克隆对象中的指定键。
此外,它
typeof obj === 'object'
不包括例如在这种情况下不复制但继续通过引用传递的函数。它还破坏了复杂的对象,如数组、集合等。因为克隆总是一个普通的对象。
对于忽略复杂对象类的简单情况,算法可能是:
例子: