映射对象,转换为数组,然后转换回对象

时间:2018-06-21 14:27:59

标签: javascript redux

我有在Redux Reducer中使用的这段代码:

maxmsgs

这里发生的是state.events是一个对象,其中每个键都是事件组的名称,值是包含事件的数组。我想做的是将对象转换为带有map的数组时,如果发生过滤器,则转换回其原始状态,其中state.events不是数组,而是具有键的原始名称的对象。 / p>

3 个答案:

答案 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])

因此,在脚本中,我们将一个空对象作为累加的初始值。