2017-09-24 10 views
0
const { items, ids } = action.payload; 
    const { fetchedItems } = state; 
    const diff = _.difference(state.ids, action.payload.ids); 
    // @APPEND 
    for (let i = 0; i < items.length; i++) { 
    fetchedItems.set(items[i].id, items[i]); 
    } 
    // @DELETE 
    for (let i = 0; i < diff.length; i++) { 
    fetchedItems.delete(diff[i]); 
    } 
    const myArray = Array.from(fetchedItems.values()); 
    return { 
    ...state, 
    items: Array.from(fetchedItems.values()), // not for use 
    fetchedItems, 
    ids: action.payload.ids, 
    syncStatus: action.payload.tocMeta.syncStatus 
    }; 

Quesstionはソケットに基づいたAPIで、新しいオブジェクトを受け取るたびにMapオブジェクトを使用して、簡単に更新および削除することができます。 、私はaction.payloadオブジェクトから来る新しいアイテムをマップの最初のインデックスに "unshift"のように設定したいと思いますが、そのためにいくつかのトリックを提供できますか?新しいMap()。Set()はMapオブジェクトの一番下に新しい項目を配置し、毎回Map.clear()を実行したくありません。"unshift"メソッドを使用してMapオブジェクトの先頭に項目を追加する

答えて

0

私はそれを行う良い方法はないと思います。マップの順序は挿入順序によって決定されるため、特定の値を最初にする場合は、唯一のオプションは最初に挿入されることを確認することです。

この場合、実際にマップを使用することをお勧めしますか。 Reduxでは、あなたのfor-loops(マップを変更する)のように状態を突然変異させることは想定されていません。それで、.set.deleteのようなメソッドを安全に使う前にマップを常にコピーする必要があるので、マップをReduxで使うのはかなり難しくなります。

Reduxのの作成者は

I don’t think it’s a good idea to use them in Redux because they are optimized for mutability. If you want to have something efficient with similar semantics, consider using Immutable.js.

だから私はおそらく.map.filterなどの便利な非変異のメソッドを持っている配列を使用してに切り替えます(設定や地図について)言っています(そして...構文で動作します)、またはオブジェクト(キーをIDとして使用し、idsを使用して注文を追跡できます)。

+1

あなたの時間のために多くのThx! –

+0

よろしくお願いします!お役に立てて嬉しいです! – jonahe

関連する問題