簡體   English   中英

映射對象,轉換為數組,然后轉換回對象

[英]Mapping an object, converting into an array, then convert back to object

我有一個我在redux reducer中使用的代碼:

  case 'REMOVE_FL_EVENT' : 
    return{
      ...state,
      events: Object.keys(state.events).map(group => {
        return state.events[group].filter(item => item.id !== action.id)
      })
    }

這里發生的是state.events是一個對象,其中每個鍵是它的事件組的名稱,值是一個包含事件的數組。 我想要做的是當我將對象轉換為帶有map的數組時,如果過濾器發生轉換回它的原始狀態,其中state.events不是數組,而是一個對象,具有鍵的原始名稱。

您可以使用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), {})
  }

輸出將是一個以鍵為組的對象。 如果有效,請告訴我。

使用標准JS,您可以使用reduce將數組轉換回obj:

arr.reduce((acc, o) => Object.assign(acc, o), {})

使用ramda.js可以過濾對象及其嵌套屬性。 https://ramdajs.com/docs/#filter

沒有必要使用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])

所以在我們的腳本中,我們給出一個空對象作為累積的初始值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM