Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何克隆JavaScript对象?_Javascript_Reactjs - Fatal编程技术网

如何克隆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))这是否回答了您的问题?