提问人:HurrayChak 提问时间:8/23/2023 更新时间:8/23/2023 访问量:37
为什么 .reduce() 仅在函数外部声明时会改变我的初始值,而在函数内部声明时不会发生白色声明?
Why .reduce() mutates my initial values only while it declares outside the function, but won't happen white declare inside?
问:
我将每笔费用按一周的 7 天分组为天。
首先,我声明一个数组,如下所示:constant.ts
const weeklySchedule = [
{
label: "Monday",
value: 0,
},
{
label: "Tuesday",
value: 0,
},
...
{
label: "Sunday",
value: 0,
},
];
并在 :Expense.tsx
const getWeeklyExpenses = (expenses: Expense[]) => {
const groupedExpenses = expenses.reduce((acc, expense) => {
const day = dayNumberNames[expense.date.getDay()]; //return day of week
const existing = acc.find((e) => e.label === day);
existing.value += expense.amount;
return acc;
}, weeklySchedule);
return groupedExpenses;
};
我发现每次我进行一些代码更改时,这些值都会不断累积,我没想到它会发生变化。但是如果我在函数内部贴花,问题就不会发生,而且工作正常。weeklySchedule
weeklySchedule
谁能告诉我在函数内部和外部声明变量有什么区别?
答:
1赞
Quentin
8/23/2023
#1
您的函数会改变传递给它的值 ()。existing.value += expense.amount
如果在程序开始时创建该对象数组一次,则每次调用该函数时,都会更改同一数组中的相同对象。
如果在函数中创建该对象数组,则每次调用该函数时都会创建一个新数组。
评论
acc
/weeklySchedule
是一个数组。它是一种引用类型。如果你在函数外部创建它一次,你会一遍又一遍地改变同一个数组;适用于变量(对数组的引用),而不是数组本身。您需要在函数中深度复制/重新创建数组才能获得新数组。请注意,数组中的对象又是引用,因此也需要复制它们(deepcopy)。const
reduce
[...weeklySchedule.map(r=> ({...r}))]