Каков самый короткий способ изменения неизменяемых объектов с использованием операторов распространения и деструкции

Я ищу чистую функцию, чтобы изменить мой неизменный объект состояния. Исходное состояние, указанное как параметр, должно оставаться нетронутым. Это особенно полезно при работе с фреймами, такими как 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 });