Skip to content
Advertisement

Sorting array by date and increment quantity on duplicate item

So I have this kind of data (simplified version):

const itemList = [
{itemDetail: {date: '2020-12-30' , quantity: 5, productType: 'shirt'  }},
{itemDetail: {date: '2021-01-05' , quantity: 4, productType: 'trouser'  }},
{itemDetail: {date: '2020-12-30', quantity: 1, productType: 'shirt'  }},
{itemDetail: {date: '2021-01-05', quantity: 2, productType: 'jacket'}}
]

The desired output:

const itemListFinalForm = [
{
   date: '2020-12-30',
   items: [{productType: 'shirt', quantity: 6}]
},
{
   date: '2021-01-05',
   items: [{productType: 'trouser', quantity: 4}, {productType: 'hat', quantity: 2}]
}
]

I’ve tried writing the pseudocode, but cant wrap my head around to actually implement it. Any kind of answer would be much appreciated. Thank you

Advertisement

Answer

Here i made a simple example below

const itemList = [{
    itemDetail: {
      date: '2020-12-30',
      quantity: 5,
      productType: 'shirt'
    }
  },
  {
    itemDetail: {
      date: '2021-01-05',
      quantity: 4,
      productType: 'trouser'
    }
  },
  {
    itemDetail: {
      date: '2020-12-30',
      quantity: 1,
      productType: 'shirt'
    }
  },
  {
    itemDetail: {
      date: '2021-01-05',
      quantity: 2,
      productType: 'jacket'
    }
  }
]


var data = itemList.reduce((acc, item) => {
  var d = acc.find(x => x.date == item.itemDetail.date);
  if (!d) {
    acc.push({
      date: item.itemDetail.date,
      items: [{
        quantity: item.itemDetail.quantity,
        productType: item.itemDetail.productType
      }]
    });
  } else {
    var type = d.items.find(x => x.productType == item.itemDetail.productType);
    if (!type) {
      d.items.push({
        quantity: item.itemDetail.quantity,
        productType: item.itemDetail.productType
      })
    } else type.quantity += item.itemDetail.quantity
  }
  return acc;
}, [])

console.log(data)
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement