为什么 .reduce() 仅在函数外部声明时会改变我的初始值,而在函数内部声明时不会发生白色声明?

Why .reduce() mutates my initial values only while it declares outside the function, but won't happen white declare inside?

提问人:HurrayChak 提问时间:8/23/2023 更新时间:8/23/2023 访问量:37

问:

我将每笔费用按一周的 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;
};

我发现每次我进行一些代码更改时,这些值都会不断累积,我没想到它会发生变化。但是如果我在函数内部贴花,问题就不会发生,而且工作正常。weeklyScheduleweeklySchedule

谁能告诉我在函数内部和外部声明变量有什么区别?

javascript typescript react-native reduce 声明

评论

0赞 Luatic 8/23/2023
acc / weeklySchedule是一个数组。它是一种引用类型。如果你在函数外部创建它一次,你会一遍又一遍地改变同一个数组;适用于变量(对数组的引用),而不是数组本身。您需要在函数中深度复制/重新创建数组才能获得新数组。请注意,数组中的对象又是引用,因此也需要复制它们(deepcopy)。const
1赞 Eldar 8/23/2023
因为您将其作为初始对象传递给函数,并在 reduce 主体中对其进行修改。相反,您可以像这样传递它的克隆:reduce[...weeklySchedule.map(r=> ({...r}))]

答:

1赞 Quentin 8/23/2023 #1

您的函数会改变传递给它的值 ()。existing.value += expense.amount

如果在程序开始时创建该对象数组一次,则每次调用该函数时,都会更改同一数组中的相同对象。

如果在函数中创建该对象数组,则每次调用该函数时都会创建一个新数组。