使用展开运算符克隆带有数组的对象
Clone Object with arrays using spread operator
如何使用新的展开运算符克隆一个包含数组的对象?
示例对象:
vehicles: {
cars: [1, 2],
boats: [3, 4]
}
我想要一个包含数组的新对象。在那个新对象中,我希望能够在不引用和影响车辆对象的情况下更改或添加到数组。
Object.assign 和传播运算符创建浅克隆,只有一层深,超出它们被引用的深度。我找到的最好方法(感谢 MDN)是使用 JSON 函数来创建一个真正的克隆。
let vehicles = {
cars: [1, 2],
boats: [3, 4],
};
let test = JSON.parse(JSON.stringify(vehicles));
console.log(vehicles, test);
test.cars[0] = 5;
vehicles.cars[0] = 7;
console.log(vehicles, test);
如果您追求性能,使用 JSON.parse(JSON.stringify(object)) 进行深拷贝和对象并不是最好的方法,而是使用像这样的深拷贝:
let x1 = {
numbers: {
number: 1
}
}
let y1 = copy(x1)
x1.numbers.number++
console.log(x1)
console.log(y1)
function copy(aObject) { // Deep Clone Object from
if (!aObject) {
return aObject;
}
let v;
let bObject = Array.isArray(aObject) ? [] : {};
for (const k in aObject) {
v = aObject[k];
bObject[k] = (typeof v === "object") ? copy(v) : v;
}
return bObject;
}
如何使用新的展开运算符克隆一个包含数组的对象?
示例对象:
vehicles: {
cars: [1, 2],
boats: [3, 4]
}
我想要一个包含数组的新对象。在那个新对象中,我希望能够在不引用和影响车辆对象的情况下更改或添加到数组。
Object.assign 和传播运算符创建浅克隆,只有一层深,超出它们被引用的深度。我找到的最好方法(感谢 MDN)是使用 JSON 函数来创建一个真正的克隆。
let vehicles = {
cars: [1, 2],
boats: [3, 4],
};
let test = JSON.parse(JSON.stringify(vehicles));
console.log(vehicles, test);
test.cars[0] = 5;
vehicles.cars[0] = 7;
console.log(vehicles, test);
如果您追求性能,使用 JSON.parse(JSON.stringify(object)) 进行深拷贝和对象并不是最好的方法,而是使用像这样的深拷贝:
let x1 = {
numbers: {
number: 1
}
}
let y1 = copy(x1)
x1.numbers.number++
console.log(x1)
console.log(y1)
function copy(aObject) { // Deep Clone Object from
if (!aObject) {
return aObject;
}
let v;
let bObject = Array.isArray(aObject) ? [] : {};
for (const k in aObject) {
v = aObject[k];
bObject[k] = (typeof v === "object") ? copy(v) : v;
}
return bObject;
}