如何克隆JavaScript对象?
在下面的函数如何克隆JavaScript对象?,javascript,reactjs,Javascript,Reactjs,在下面的函数formatHours()中,我试图将newHours分配给selectedLocation.data.hours(一个对象) 我正在使用spread操作符克隆对象,这样当函数完成时,selectedLocation.data.hours保持不变,但它不会。此函数运行后,selectedLocationd.data.hours现在等于newHours formatHours(): const formatHours = () => { // ERROR: trying
formatHours()
中,我试图将newHours
分配给selectedLocation.data.hours
(一个对象)
我正在使用spread操作符克隆对象,这样当函数完成时,selectedLocation.data.hours保持不变,但它不会。此函数运行后,selectedLocationd.data.hours
现在等于newHours
formatHours():
const formatHours = () => {
// ERROR: trying to clone selectedLocation.data.hours, but not working
const newHours = { ...selectedLocation.data.hours };
// loop through all hours and convert them to javascript date with .toDate()
for (const hour in newHours) {
newHours[hour][0] = newHours[hour][0].toDate();
newHours[hour][1] = newHours[hour][1].toDate();
}
// set hours state with updated hours
setHours(newHours);
};
下面是通过formatHours()传递selectedLocation.data.hours
之前的样子:
(Firebase Firestore时间戳数组的对象)
以下是通过formatHours()
传递选择的location.data.hours后的外观:
(Javascript日期对象数组的对象)
注意:
selectedLocation.data.hours
在功能前后应保持不变,但不会改变。我一定是遗漏了什么。不要更改newHours[hour]
数组(它会改变当前处于状态/道具中的对象),而是在该位置创建一个全新的数组,具有所需的属性:
// Shallow clone newHours
const newHours = { ...selectedLocation.data.hours };
// Reassign each property; it'll affect the clone, not the original
for (const [hour, arr] of Object.entries(newHours)) {
newHours[hour] = [
arr[0].toDate(),
arr[1].toDate(),
arr[2]
];
}
另一种方法,使用对象.fromEntries
:
const newHours = Object.fromEntries(
Object.entries(selectedLocation.data.hours).map(([hour, arr]) => (
[ // return an entry array
hour, // key in new object
[ // value in new object
arr[0].toDate(),
arr[1].toDate(),
arr[2]
]
]
))
);
我不确定这是否是最好的方法,但你可以做到
const newHours=JSON.parse(JSON.stringify(selectedLocation.data.hours))代码>这是否回答了您的问题?