Search code examples
javascriptarraysreduximmutability

I want to filter out an array of objects by ids in another array


I have an array of objects i.e queueDetails[{},{}]. I have another array of ids from response "payload":[{"id":"1"},{"id":"2"}]. I want to filter out the ids in payload from queueDetails for which I have following code:

action.payload.map(payload => {
       state.queueDetails.filter(queue => queue._id !== payload.id)              
})

return {
           ...state,
           queueDetails: ???
        }

How do I proceed from here.


Solution

  • I think, it's safe to guess, you're building part of Redux store reducer, if that's the case, corresponding case section for filtering action may be something, like:

    case FILTER_QUEUE_DETAILS : {
       const { queueDetails } = state,
             { payload } = action,
             submittedIds = payload.map(({id}) => id)
       return {...state, queueDetails: queueDetails.filter(({id}) => !submittedIds.includes(id))}
    }
    

    You may find the quick demo below:

    const { createStore } = Redux
          
    const defaultState = {queueDetails:[{id:1,data:'somedata'},{id:2,data:'moredata'},{id:3,data:'somemore'}]},
          FILTER_QUEUE_DETAILS = 'FILTER_QUEUE_DETAILS',
          appReducer = (state=defaultState, action) => {
            switch(action.type) {
              case FILTER_QUEUE_DETAILS : {
                 const { queueDetails } = state,
                       { payload } = action,
                       submittedIds = payload.map(({id}) => id)
                 return {...state, queueDetails: queueDetails.filter(({id}) => !submittedIds.includes(id))}
              }
              default: return state
            }
          },
          store = createStore(appReducer)
    
    //initial state
    console.log(`// initial state:\n`, store.getState())      
    
    //dispatch action to filter out id's 1, 3
    store.dispatch({
      type: FILTER_QUEUE_DETAILS,
      payload: [{id:1},{id:3}]
    })
    
    //log resulting state
    console.log(`// state upon id's 1 and 3 filtered out:\n`,store.getState())
    .as-console-wrapper {min-height:100%}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.5/redux.min.js"></script>