Во-первых: вы неверно обновляете структуру - ни в коем случае нельзя мутировать объект.
Во-вторых: почему сразу не сформировать объект action с нужными названиями свойств? (_key, _value)
const action = {
id: 132,
_key: 'some key',
_value: 564
}
return {
...state,
structure: {
...state.structure,
[id]: { ...(state.structure[id] || {}), ...action },
}
}
Выражение ниже нужно чтобы не получить ошибку, если вдруг state.structure[id] === udefined. Если вы уверены, что такого никогда не случится - можете оставить только ...state.structure[id].
...(state.structure[id] || {})
UPD1. Удаление объекта
Если вы используете lodash (или аналоги) в своем проекте, то удалить можно следующим образом:
import _ from 'lodash'
const { id, parentId } = action
// удаляем из структуры свойство с именем id
const nextStructure = _.omit(state.structure, id)
return {
...state,
structure: {
...nextStructure,
[parentId]: {
...nextStructure[parentId],
childIds: nextStructure[parentId].childIds.filter(cId => cId !== id)
}
}
}
Если же вы не используете lodash, то можно сделать так (ссылка на
документацию):
const { id, parentId } = action
// в данном случае у нас будет переменная
// const removed = state.structure[id]
// а в переменную nextStructure попадут все значения, кроме id
const { [id]: removed, ...nextStructure } = state.structure
return {
...state,
structure: {
...nextStructure,
[parentId]: {
...nextStructure[parentId],
childIds: nextStructure[parentId].childIds.filter(cId => cId !== id)
}
}
}