Search code examples
reactjsreact-reduxreselect

How to use redux reselect avoiding redundancy


I have a redux state containing posts, which I store as a single object with the following shape:

posts: {
   1: { isPublic: true, content: 'foo' },
   2: { isPublic: true, content: 'bar' },
   3: { isPublic: false, content: 'foobar' },
}

I'm fetching the state using reselect from my component, and I have created 2 selectors for that:

const getPostsEntities = (state) => state.posts;


export const getPosts = createSelector(
    [ getPostsEntities ],
    (posts) => Object.keys(posts).map( id => posts[id])
);

export const getPublicPosts= createSelector(
    [ getPostsEntities ],
    (posts) => Object.keys(posts).map( id => posts[id]).filter( post => post.isPublic )

);

My doubt is about this part which seems redundant in any selector

(posts) => Object.keys(posts).map( id => posts[id])

I thought about having the getPostsEntities return directly the array, but I'm having some issue understanding what's the best practice


Solution

  • As mentioned by @HMR, you can use one reselect selector inside another. So getPublicPosts can be based on the memoized results from getPosts. You can also use Object.values() instead of Object.keys().

    const getPostsEntities = (state: State) => state.posts;
     
    export const getPosts = createSelector(
        [ getPostsEntities ],
        (posts) => Object.values(posts)
    );
    
    export const getPublicPosts = createSelector(
        [ getPosts ],
        (posts) => posts.filter(post => post.isPublic)
    );