2017-01-16 19 views
1

私は多くの州を持つ注文還元剤を持っています。どのように反応の状態の配列をフィルタリングできますか?

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

フィルタしたいものはmenuです。 menuは、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;}} 

そうするために、上記のようなコードを作成しました。いくつかのフィルタリングされた値を返すにもかかわらず、多くのfalse値を持つ同じ数の配列を示します。私はそれを行うための他のアプローチを探したいです。

どうすればいいですか?

ありがとうございます。

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

P.S:

答えて

2

filter機能を使用してください、私はそれが私はあなたがこの目的のためにimmutable.jsを使用することができますと言うでしょうImmutable.js

+0

についての詳細をチェックアウトすることができます?任意の利点は単に 'filter'関数を使用することと比較しますか? –

+0

不変を使用する主な理由は、オブジェクト全体の高価な複製を避けるためです。変更不可能なオブジェクトは、以前のバージョンとの差分のみを格納します。大きな状態のオブジェクトを持つ大規模なプロジェクトでは、特に高速に動作します。利点についての詳細を読むことができます[ここ](http://stackoverflow.com/questions/39227832/advantages-of-using-immutable-js-over-object-assign-or-spread-operators) –

1

を使用することをお勧めします、以下の答えに同意します。地図にfilterを追加できます。

あなたは

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

P.Sような何かを試すことができます:私は上記のコードをテストしているが、それは少しの変更で動作するはずです。

あなたはImmutable.jsを使用することをお勧めしていることだと思いますなぜあなたは不変here

+0

ありがとう、私は ' (immutable.map)が定義されていないというエラーが発生します。そこで、 'Immutable.Map(state。メニュー).... 'しかし、それでも'メニューが定義されていないというエラーを引き起こします。どうすればよいですか? –

0
onTodoClick(id){ 
     this.setState({items: this.state.items.filter(item => item.news_id == id) 
     }); 
    } 
関連する問題