2016-11-24 54 views
0

假設我定義了一個reducer,它返回一個包含諸如id之類的鍵的對象數組。在數組中獲取/查找某個具有某個id的某個對象的方式是什麼?陣列本身可以包含幾個陣列:如何通過鑰匙獲取redux商店中的物品?

{ items:[id:1,...],cases:{...}} 

通過id找到記錄/節點的方法是什麼?

回答

0

有沒有特殊的方式與redux做到這一點。這是一個普通的JS任務。我想你使用的反應,以及:

function mapStoreToProps(store) { 
    function findMyInterestingThingy(result, key) { 
     // assign anything you want to result 
     return result; 
    } 

    return { 
     myInterestingThingy: Object.keys(store).reduce(findMyInterestingThingy, {}) 
     // you dont really need to use reduce. you can have any logic you want 
    }; 
} 

export default connect(mapStoreToProps)(MyComponent) 

問候

+0

這看起來很酷,但你有一個codepen或什麼? –

0

我會使用一個庫像lodash

var fred = _.find(users, function(user) { return user.id === 1001; }); 

fiddle

這可能是值得指出的是,它被認爲是在商店中「優先考慮對象而不是數組」的好習慣(特別是對於大型狀態樹);在這種情況下,你會儲存項目與(比如說)id作爲重點對象:

{ 
    '1000': { name: 'apple', price: 10 }, 
    '1001': { name: 'banana', price: 40 }, 
    '1002': { name: 'pear', price: 50 }, 
} 

這使得選擇更容易,但你必須加載時安排狀態的形狀。

0

存儲這種數據的最佳方法是將它們存儲在reducer中的對象中,並將它們存儲在byId和​​中。
你的情況,那就是:

{ 
    items: { 
    byId : { 
     item1: { 
     id  : 'item1', 
     details: {} 
     }, 
     item2: { 
     id  : 'item2', 
     details: {} 
     } 
    }, 
    allIds: [ 'item1', 'item2' ], 
    }, 

    cases: { 
    byId : { 
     case1: { 
     id  : 'case1', 
     details: {} 
     }, 
     case2: { 
     id  : 'case2', 
     details: {} 
     } 
    }, 
    allIds: [ 'case1', 'case2' ], 
    }, 
} 

編號:http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html

這有助於保持國家標準化兩個維護以及使用數據。
這樣可以更容易地遍歷所有數組並渲染它,或者如果我們需要通過它的id來獲取任何對象,那麼它將是一個O(1)操作,而不是每次都以完整數組迭代。