2016-11-24 2 views
0

Предположим, у меня есть редуктор, который возвращает массив объектов, содержащих ключи, такие как идентификатор или что-то в этом роде. Каков редукционный способ получения/поиска определенного объекта с определенным идентификатором в массиве. Сам массив может содержать несколько массивов:Как я могу получить элемент в магазине redux ключом?

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

Что такое перевождь пути, чтобы найти запись/узел по идентификатору?

ответ

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

Это выглядит круто, но есть ли у вас кодекс или что-то в этом роде? –

0

Я хотел бы использовать библиотеку как lodash:

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

fiddle

Может быть, стоит отметить, что это считается хорошей практикой «предпочитать объекты над массивами» в магазине (особенно для больших государственных деревьев); в этом случае вы бы сохранить эти элементы в объекте с (скажем) идентификатор в качестве ключа:

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

Это делает выбор проще, однако вы должны организовать форму государства при загрузке.

0

Идеальный способ сокращения таких данных - хранить их byId и allIds в объекте в редукторе.
В вашем случае это будет:

{ 
    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' ], 
    }, 
} 

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

Это помогает в поддержании состояния нормализованы и сохранения, а также с использованием данных.
Этот способ упрощает итерацию по всему массиву и отображает его, или если нам нужно получить какой-либо объект только по его идентификатору, то это будет операция O(1), а не итерация каждый раз в полном массиве.