[英]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.