Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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
Reactjs 为什么要用其他数组初始化数组,导致其他数组更改_Reactjs_React Native - Fatal编程技术网

Reactjs 为什么要用其他数组初始化数组,导致其他数组更改

Reactjs 为什么要用其他数组初始化数组,导致其他数组更改,reactjs,react-native,Reactjs,React Native,我有一个固定的星期数组(名为“allHours”): 现在我想循环它并为每次迭代操作新数组(可用小时), 所以在for循环之后我放了:让availableHours=[…allHours] 代码是: export const getAvailableMeetings = meetings => { const finalArray = []; for (let i = 0; i < 7; i++) { let availableHours = [...allHours];/

我有一个固定的星期数组(名为“allHours”):

现在我想循环它并为每次迭代操作新数组(可用小时), 所以在for循环之后我放了:让availableHours=[…allHours]

代码是:

export const getAvailableMeetings = meetings => {
const finalArray = [];
for (let i = 0; i < 7; i++) {

    let availableHours = [...allHours];///// here i expected to see the
    ///// availableHours array initialize again and all the busy field - initialize to false in each iterate

    const date = moment().add(i, "days");
    meetings.map(meet => {
        if (moment(meet.date).startOf("day").isSame(date.startOf("day"), "days")) {
            console.log("start of iterate", date.startOf("day"), "strartof meetings", moment(meet.date).startOf("day"));
            let busyHour = availableHours.findIndex(i => i.hour === moment(meet.date).format("LT"));
            availableHours[busyHour].busy = true;
        }
    });

    finalArray.push({
        key: i,
        date: date.toISOString(),
        dayName: moment().add(i, "days").format("dddd"),
        hours: date.weekday() === 5 || date.weekday() === 6 ? [] : availableHours,
    });
}

return finalArray;
export const getAvailableMeetings=会议=>{
警察局局长=[];
for(设i=0;i<7;i++){
我希望在这里能看到
/////availableHours数组再次初始化,所有忙字段在每次迭代中初始化为false
常数日期=时刻()。添加(i,“天”);
meetings.map(meeting=>{
如果(时间(会面日期).startOf(“日期”).isame(日期.startOf(“日期”),“天”)){
console.log(“迭代的开始”、date.startOf(“日”)、“strartof meetings”、time(meet.date).startOf(“日”);
让busyHour=availableHours.findIndex(i=>i.hour===moment(meet.date.format)(“LT”);
可用时数[busyHour].busy=true;
}
});
最后推({
关键:我,,
日期:date.toISOString(),
dayName:moment().add(i,“days”).format(“dddd”),
小时数:date.weekday()==5 | | date.weekday()==6?[]:可用小时数,
});
}
返回最终射线;
})

关于守则中的评论, 我希望在每次迭代时初始化可用小时。 但事实并非如此,继续填充半身像, 当我在控制台上记录“allHours”数组时,我看到busy字段被availableHours更改了


**这里的重点是为什么allHours数组相对于availableHours数组发生了更改**

您有一个对象引用数组。如果复制阵列,则会有一个副本。。。但每个复制的元素仍然是对同一对象的引用

您需要执行以下操作:

let availableHours = allHours.map((el) => { ...el });

这与通过引用存储变量与通过值存储变量有关。对象通过引用存储在内存中,而spread操作符只执行浅克隆,而不执行深克隆。因此,
availableHours
本身就是一个新的数组,但其中的对象与
allHours
中的对象在内存中是相同的。您可以查看解释按引用存储与按值存储的文章,例如:我将这一行替换为:let availableHours=[…allHours];我得到了“decellation或statement expectedok我添加了括号,我想它是为了返回(?)let availableHours=allHours.map(el=>({…el}));像魔术一样工作
let availableHours = allHours.map((el) => { ...el });