我有在Redux Reducer中使用的这段代码:
maxmsgs
这里发生的是state.events是一个对象,其中每个键都是事件组的名称,值是包含事件的数组。我想做的是将对象转换为带有map的数组时,如果发生过滤器,则转换回其原始状态,其中state.events不是数组,而是具有键的原始名称的对象。 / p>
答案 0 :(得分:1)
您可以为此使用map / reduce。首先将其映射,然后将其简化为一个对象。
case 'REMOVE_FL_EVENT' :
return{
...state,
events: Object.keys(state.events).map(group => {
return { [group]: state.events[group].filter(item => item.id !== action.id) }
}).reduce((obj, event) => Object.assign(obj, event), {})
}
输出将是一个以键为组的对象。让我知道它是否有效。
答案 1 :(得分:1)
使用标准JS,您可以使用reduce
将数组转换回obj:
arr.reduce((acc, o) => Object.assign(acc, o), {})
使用ramda.js
可以过滤对象及其嵌套属性。 https://ramdajs.com/docs/#filter
答案 2 :(得分:1)
无需使用map
,只能使用reduce
,例如:
{
...state,
events: Object.keys(state.events).reduce(
(obj, event) => ({
...obj,
[group]: state.events[group].filter(item => item.id !== action.id)
}),
{}
)
};
reduce
具有以下签名:
arr.reduce(callback[, initialValue])
因此,在脚本中,我们将一个空对象作为累加的初始值。