0

I've got an array of products. The products can be of two types - simcards and devices. I'd like to filter them into one object with 2 values, containing arrays of simcars and devices correspondingly E.g.

const sourceArray = [
  {id: 1, name: 'Name', type: 'device'}, 
  {id: 2, name: 'Name2', type: 'simcard'}, 
  {id: 3, name: 'Name3', type: 'device'}, 
  {id: 4, name: 'Name4', type: 'device'}]

Expected result:

    const resultObj = {
      devices: [
        {id: 1, name: 'Name', type: 'device'}, 
        {id: 3, name: 'Name3', type: 'device'}, 
        {id: 4, name: 'Name4', type: 'device'}],
      simCards: [{id: 2, name: 'Name2', type: 'simcard'}]
    }

I'm trying to do this with reduce method, but got undefined arror. Could you assist what's wrong here?

const sourceArray = [{id: 1, name: 'Name', type: 'device'}, {id: 2, name: 'Name2', type: 'simcard'}, {id: 3, name: 'Name3', type: 'device'}, {id: 4, name: 'Name4', type: 'device'}]

sourceArray.reduce((result, orderItem) =>
  orderItem.type === 'device' ?
  result.devices.push(orderItem) :
  result.simCards.push(orderItem), {
    devices: [],
    simCards: []
  })
mplungjan
  • 169,008
  • 28
  • 173
  • 236
ylsv
  • 123
  • 1
  • 2
  • 10
  • 2
    Your reduce is not correct. You need this format: `const targetArray = sourceArray.reduce((result, orderItem) => { orderItem.type === 'device' ? result.devices.push(orderItem) : result.simCards.push(orderItem); return result; }, { devices: [], simCards: [] });` – mplungjan Aug 31 '21 at 10:28
  • 1
    You should return `result` here? [codepen](https://codepen.io/kumarmasterpraveen/pen/KKqVJWq?editors=0011) – DecPK Aug 31 '21 at 10:29
  • 1
    Or much simpler `const targetArray = sourceArray.reduce((result, orderItem) => { result[orderItem.type].push(orderItem); return result; }, { devices: [], simCards: [] });` – mplungjan Aug 31 '21 at 10:31

0 Answers0