Я чувствую, что схожу с ума, следующий код просто не работает, когда используется в редукторе, однако запуск его с точно такими же переменными в консоли или на игровой площадке работает абсолютно идеально.
[MutationTypes.DELETE_GOALS_SUCCESS]: (state, { payload }) => {
//payload is {deleted_goals: [1, 2, 3]}, goals is {1: {...}, 2: {...}, ... n: {...}}
const goals = { ...state.goals };
const newGoals = payload.deleted_goals.reduce((acc, id) => {
const { [id]: omitted, ...newAcc } = acc; //newAcc still contains "id" key
console.log(
"After spread",
"New goals:",
newAcc,
"Old goals:",
acc, //acc and newAcc are the same aside from different pointers
"Removed goal",
omitted,
);
return newAcc;
}, goals);
return {
...state,
goals: newGoals,
};
},
Часть const { [id]: omitted, ...newAcc } = acc;
- это то, что просто не работает, как задумано. newA cc по какой-то причине все еще содержит ключ id
, поэтому он остается неизменным при каждой итерации. Ключ id
включен в объект целей, я могу войти в объект omitted
. Как я уже сказал, я могу запустить точно такую же строку кода в любом месте с точно такими же переменными, и это будет отлично работать. Это может быть что-то с редуксом или моей реализацией редуктора, однако я просто не могу представить, что может быть не так и как это может вызвать такие последствия. State - это просто объект, state.goal - это просто объект, я даже делаю его мелкую копию. Я могу JSON.stringify
их скопировать вставить куда-нибудь еще, а затем опустить то же самое, что и здесь, и это будет работать. Есть идеи, что может вызвать это странное взаимодействие? Есть несколько обходных путей, чтобы сделать это без распространения, например, используя оператор удаления или создание нового объекта с нуля, но я хочу знать, почему ад может стать «невосприимчивым» к распространению деструктуризации.
Я пытался пропустите с расширением на fre sh объект внутри обработчика действия и уменьшите обратный вызов, и это сработало, похоже, что-то есть с этим конкретным объектом (state.goals). Однако это просто карта, подобная объекту, структурированному так: {id1: {goalwithid}, id2:{goalwithid2} ...}
id1, id2 et c - это числа.
Только что попробовал глубоко клонировать объект (заменил const goals = { ...state.goals };
на const goals = _.cloneDeep(state.goals)
, и это ничего не меняет .