Как добавить / удалить в массиве внутри динамического объекта - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть редуктор с такой структурой:

{
  [key]: {
    answers: [
      { key: 1, mode: 'INCLUDE' }
    ],
    period: {},
  }
}

Теперь я хотел бы добавить элементы в массив ответов, но это не работает (внутри редуктора). Потому что тогда каждый раз заменяется единственный существующий элемент массива.

return {
  ...state,
  [action.payload.serieId]: {
    ...state[action.payload.serieId],
    answers: [
      { ...action.payload.answerFilter },
    ],
  },
}

Это также не работает, потому что свойство ... state [action.payload.serieId] .answers не может быть найдено.

return {
  ...state, [action.payload.serieId]: 
  {
    ...state[action.payload.serieId],
    answers: [ 
      ...state[action.payload.serieId].answers
      { ...action.payload.answerFilter },
    ],
  },
}

Ошибка:

TypeError: Cannot convert undefined or null to object

Есть ли какой-нибудь способ решить это внутри редуктора или мне нужно изменить весь массив снаружи, а затем просто установить его полностью во время каждого изменения?

«Ответы» - это массив, потому что там может быть несколько фильтров.

1 Ответ

0 голосов
/ 07 ноября 2018

Вам необходимо применить значение по умолчанию, если serieId не найден в состоянии редуктора, поэтому это будет полезно, если вы сделаете что-то вроде

const currentSerie = state[action.payload.serieId] || generateStateFromScratch();

тогда вы могли бы сделать что-то вроде

return {
  ...state,
  [action.payload.serieId]: {
    ...currentSerie,
    ...{
      answers: [ ...currentSerie.answers, { ...action.payload.answerFilter } ]
    }
  }
}

так вам generateStateFromScratch функция должна выглядеть вот так

const generateStateFromScratch = () => ({
    answers: [
      { key: 1, mode: 'INCLUDE' }
    ],
    period: {}
})

При необходимости вы можете вернуть пустой массив answers в исходное состояние.

...