从不可变对象中删除键(redux状态)

时间:2017-03-17 04:04:45

标签: redux immutability

我正在写一个redux reducer来从状态对象中删除一个键:

state = {
  items: {
    key1: {foo: 'bar'},
    key2: {foo: 'baz'}
  },
  someOtherKey: 'value'
}

我的减速机:

function reducer(state, action) {
  if (action=='DEL') {
    return {
      ...state,
      items: {
        ...state.items,
        [action.key]: undefined
      }
    }
  }
}       

我希望这会返回一个删除了相应属性的新状态,而是返回一个新状态,该对象仍然存在于对象中,但值为undefined

在ES6中有一种优雅的方式来编写这样的减速器吗?我想我可以使用Object.assign并删除属性,但上面的模式更具表现力,所以我想尽可能以这种方式编写它。

2 个答案:

答案 0 :(得分:3)

我最终使用了lodash函数omit

import { omit } from 'lodash'

function reducer(state, action) {
  if (action=='DEL') {
    return {
      ...state,
      items: omit(state.items, action.key)
      }
    }
  }
}

lodash库包含这样一个函数的事实让我想到在简单的JavaScript中表达操作可能没有更简单的方法。如果我错了,请告诉我;我很想听听。

答案 1 :(得分:0)

未经测试,这是怎么回事?它将为每个项目创建一个浅层副本(不可变),但您不关心的项目除外。

function reducer(state, action) {
    if (action == 'DEL') {
        return {
            ...state,
            items: Object.keys(state.items).reduce((obj, key) => {
                if (key !== action.key) {
                    obj[key] = { ...state.items[key]
                    }
                }
            })
        }
    }
}