2017-01-16 33 views
1

我有訂單減速機,它有許多州。如何過濾響應中的狀態數組?

const initialState = { 
channel: null, 
order: {}, 
fetching:true, 
menu: [], 
categories: [], 
subcategories: [], 
currentCategoryId: 1, 
currentSubcategoryId: 5, 
currentMenu: [], 
}; 

我想過濾的是menumenu是具有menu_item的對象的狀態數組,我有currentCategoryIdcurrentSubcategoryId。我想要對這些狀態做的是,通過使用currentCategoryIdcurrentSubcategoryId來篩選menu並將篩選後的狀態設置爲currentMenu

case Constants.ORDER_CHANNEL_CONNECTED: 
return 
    {...state,currentMenu: action.menu.map((menu) => { 
        if(state.currentCategoryId == menu.category_id){ 
         return menu; 
        } 
        else return false;}} 

所以要做到這一點,我做了上面的代碼。即使它返回一些過濾的值,它也會顯示具有許多錯誤值的相同數量的數組。我想找到其他方法來做到這一點..

我該怎麼做?

在此先感謝。

回答

2

請使用filter功能:

{...state,currentMenu: action.menu.filter((menu) => 
state.currentCategoryId == menu.category_id)} 

P.S:我同意下面的答案,這是更好地使用Immutable.js

+0

爲什麼你認爲它是更好地使用Immutable.js?任何好處相比,只使用'過濾器'功能? –

+0

使用immutable的主要原因是爲了避免昂貴的克隆整個對象。不可變的對象存儲只與以前的版本有所不同。它的工作速度更快,特別是在擁有大型狀態對象的大項目中你可以閱讀更多關於好處[這裏](http://stackoverflow.com/questions/39227832/advantages-of-using-immutable-js-over-object-assign-or-spread-operators) –

1

我會說你可以使用immutable.js用於此目的。您可以將filter添加到您的地圖。

你可以嘗試像

Immutable.map(state.menu).filter(state.currentCategoryId===menu.category_id) 

P.S:我已經測試上面的代碼,但它應該與小的修改工作。

您可以檢查出更多的不可變here

+0

謝謝,我試過' currentMenu:Immutable.map(state.menu).filter(state.currentCategoryId === menu.category_id)',但它會觸發'Immutable.map沒有被定義的錯誤'..所以我嘗試了'Immutable.Map(state。菜單)....'但它仍然觸發錯誤,菜單沒有定義,我應該如何改變? –

0
onTodoClick(id){ 
     this.setState({items: this.state.items.filter(item => item.news_id == id) 
     }); 
    }