@ivaboyto

Каким образом добавить поле в объекте в редьюсере?

В store есть такой массив:
plans: [
  [ {id: 1},{id: 2},{id: 3} ],
  [ {id: 4},{id: 5},{id: 6} ],
  [ {id: 7},{id: 8},{id: 9} ],
]

В reducer прилетает такое:
case "TEST":
console.log(action.someID) // 3
console.log(action.value) // "SomeValue"
	return {
		...state,
		plans: ???
	};


Нужно иммутабельно вернуть массив plans, но в объект с id который равен action.someID, добавить новое поле с названием value которое будет равно action.value.

Тоесть в данном случае на выходе должно получиться такое:
plans: [
  [ {id: 1},{id: 2},{id: 3, value: "SomeValue"} ],
  [ {id: 4},{id: 5},{id: 6} ],
  [ {id: 7},{id: 8},{id: 9} ],
]


У меня мозг взорвался от вложенности, помогите, пожалуйста, у меня всё время массив без нового поля возвращается.
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
return {
  ...state,
  plans: state.plans.map(n => {
    const item = n.find(m => m.id === action.id);
    return item
      ? n.map(m => m === item ? { ...m, value: action.value } : m)
      : n;
  }),
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Intspirit Краснодар
от 80 000 до 150 000 ₽