Каков самый короткий способ изменения неизменяемых объектов с использованием операторов распространения и деструкции
Я ищу чистую функцию, чтобы изменить мой неизменный объект состояния. Исходное состояние, указанное как параметр, должно оставаться нетронутым. Это особенно полезно при работе с фреймами, такими как Redux и работает с immutable объект в javascript намного проще. Тем более что работа с оператором распространения объектов с использованием Babel уже возможна.
Я не нашел ничего лучше, чем первый экземпляр объекта, а не назначить/удалить свойство, которое я хочу:
function updateState(state, item) {
newState = {...state};
newState[item.id] = item;
return newState;
}
function deleteProperty(state, id) {
var newState = {...state};
delete newState[id];
return newState;
}
Мне кажется, что это может быть короче
Ответы
Ответ 1
Действия по состоянию, где состояние считается неизменным.
Добавление или обновление значения свойства:
// ES6:
function updateState(state, item) {
return Object.assign({}, state, {[item.id]: item});
}
// With Object Spread:
function updateState(state, item) {
return {
...state,
[item.id]: item
};
}
Удаление свойства
// ES6:
function deleteProperty(state, id) {
var newState = Object.assign({}, state);
delete newState[id];
return newState;
}
// With Object Spread:
function deleteProperty(state, id) {
let {[id]: deleted, ...newState} = state;
return newState;
}
// Or even shorter as helper function:
function deleteProperty({[id]: deleted, ...newState}, id) {
return newState;
}
// Or inline:
function deleteProperty(state, id) {
return (({[id]: deleted, ...state}) => state)(state);
}
Ответ 2
Решение ES6, которое имеет немного большую поддержку, Object.assign
:
const updateState = (state, item) => Object.assign({}, state, { [item.id]: item });