我正在写一个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
并删除属性,但上面的模式更具表现力,所以我想尽可能以这种方式编写它。
答案 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]
}
}
})
}
}
}