Существует несколько способов работы с глубоко вложенными структурами данных в Redux.В документации к редуксу есть хорошая статья о нормализации формы состояния , которая может помочь избежать этой проблемы в целом.
Если выравнивание состояния не является вариантом, я бы порекомендовал использовать служебную библиотеку для измененияглубоко вложенные объекты.Я предпочитаю ramda.js , но lodash и т. Д. Также содержат такую функциональность.
С помощью ramda вы можете писать редукторы, используя "линзы", чтобы изменять вложенное состояние, не изменяя исходного состояния.
Используя ramda, ваше возвращаемое выражение может быть написано так:
// import * as R from 'ramda'
return R.over(
R.lensPath([
'buckets', action.indexBucket,
'blocks', action.indexBlock,
'messages', 0,
'replies',
]),
R.move(action.indexReply, action.payload.newIndex),
state,
)
Я не уверен, что это точно решит вашу проблему, потому что ваш вопрос не включает минимальный, полный и проверяемый пример , но я думаю, что он довольно близок к тому, что вы хотите.
Если вам не нравится стиль функционального программирования ramda, вы можете проверить immer для совершенно другого подхода к неизменяемому состоянию.
Возможно переписать ваш код без использования служебной библиотеки, но очень трудно избежать ошибок, и ваш код будет намного сложнее читать.