#javascript #redux
Вопрос:
У меня следующее состояние
const state = { courses: [], series: [], course: { title: 'testing', course_notes: [ { id: 1, note: "one" // want to edit this }, { id: 2, note: "two" } ] } }
Я хочу измениться state.course.course_notesp[0].name
Я никогда полностью не понимал, как это работает, прочитал много учебных пособий, я чувствую, что знаю, как это работает, но это всегда сбивает меня с толку. Это то, что я пытаюсь
const m = { ...state, course: { course_notes:[ ...state.course.course_notes, state.course.course_notes.find(n =gt; n.id === 1).note = "edited" ] } }
Это, кажется, добавляет edited
дополнительный узел. state.course.course_notes.length
в конце концов, так оно и есть 3
.
Ответ №1:
Вы используете оператор распространения для массивов, как и для объектов.
Предположим, у вас есть объект
const obj = { a: 1, b: 2 }
Если вы скажете:
{...obj, a: 2}
То, что вы говорите, это:
{ a: 1, b: 2, a: 2 }
Свойство a
определено дважды, но второе переопределяет первое.
Однако, если вы сделаете что-то подобное для массива, результат будет другим:
const arr = [1, 2]; const newArr = [...arr, arr[0]]; // here the result would be [1, 2, 1]
Вот почему, когда вы говорите:
course_notes:[ ...state.course.course_notes, state.course.course_notes.find(n =gt; n.id === 1).note = "edited" ]
что он делает, так это добавляет дополнительный элемент в массив.
Вместо этого вам следует создать измененную версию массива, например, с помощью map
course_notes: state.course.course_notes.map(el =gt; { if (el.id === 1) { el.note = 'edited'; } return el; });
Ответ №2:
Существует множество способов изменить состояние вашего магазина, чтобы обновить один элемент course_notes.
Если бы мы предполагали, что идентификаторы уникальны, я бы сопоставил предыдущий массив, изменив элемент с идентификатором 1.
.... course_notes: state.course.course_notes.map(x =gt; x === 1 ? { ...x, note: 'edited' } : x ) ...