Marius
Marius

Reputation: 2008

Merge same object property name and combine other properties in one array object

Trying to convert from this:

    const dataState = [
      { key: 1, name: 'First', quantity: 3, time: '13:7:2' },
      { key: 1, name: 'First', quantity: 2, time: '13:7:2' },
      { key: 3, name: 'Third', quantity: 23, time: '13:7:7' },
      { key: 1, name: 'First', quantity: 3343, time: '13:7:16' },
      { key: 3, name: 'Third', quantity: 443, time: '13:7:20' },
    ]

to

  const dataState = [
    { key: 1, name: 'First', quantity: [3, 2, 3343], time: ['13:7:2', '13:7:2', '13:7:16'] },
    { key: 3, name: 'Third', quantity: [23, 443], time: ['13:7:7', '13:7:20'] },
  ]

So far i have done:

const dataState = [
      { key: 1, name: 'First', quantity: 3, time: '13:7:2' },
      { key: 1, name: 'First', quantity: 2, time: '13:7:2' },
      { key: 3, name: 'Third', quantity: 23, time: '13:7:7' },
      { key: 1, name: 'First', quantity: 3343, time: '13:7:16' },
      { key: 3, name: 'Third', quantity: 443, time: '13:7:20' },
    ]

    let uniqueName = [...new Set(dataState.map((a) => a.name))]
    console.log('uniqueName', uniqueName)

    let name = []
    let quantity = []
    let time = []
    for (let i = 0; i < dataState.length; i += 1) {
      if ('First' === dataState[i].name) {
        name = name.concat(dataState[i].name)
        name = [...new Set(name)]
        quantity = quantity.concat(dataState[i].quantity)
        time = time.concat(dataState[i].time)
      }
    }
    console.log([{ name, quantity, time }])

Issue with my approach are:

  1. Currently i have to manually set First or Third, etc...
  2. Only loops for the value i have set example: First, so need more logic to create another object for Third and etc...

Please ignore that I'm using name property as key identifier i know i should be using key for this.

Upvotes: 2

Views: 731

Answers (2)

ABGR
ABGR

Reputation: 5205

Could you do something like this?

 const dataState = [
      { key: 1, name: 'First', quantity: 3, time: '13:7:2' },
      { key: 1, name: 'First', quantity: 2, time: '13:7:2' },
      { key: 1, name: 'Third', quantity: 23, time: '13:7:7' },
      { key: 1, name: 'First', quantity: 3343, time: '13:7:16' },
      { key: 3, name: 'Third', quantity: 443, time: '13:7:20' },
    ]

    
    var objKey = {};
    
    for (let i of dataState){
     if(objKey[i.key]){
       objKey[i.key].quantity.push(i.quantity);
       objKey[i.key].time.push(i.time);
     }else{
       objKey[i.key] = i;
       objKey[i.key].quantity = [objKey[i.key].quantity]
       objKey[i.key].time = [objKey[i.key].time]
     }
    }
 console.log(Object.values(objKey))

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386578

You could take a single loop approach with an object as hash table.

const
    dataState = [{ key: 1, name: 'First', quantity: 3, time: '13:7:2' }, { key: 1, name: 'First', quantity: 2, time: '13:7:2' }, { key: 3, name: 'Third', quantity: 23, time: '13:7:7' }, { key: 1, name: 'First', quantity: 3343, time: '13:7:16' }, { key: 3, name: 'Third', quantity: 443, time: '13:7:20' }],
    result = Object.values(dataState.reduce((r, { key, name, quantity, time }) => {
        if (!r[key]) r[key] = { key, name, quantity: [], time: [] };
        r[key].quantity.push(quantity);
        r[key].time.push(time);
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 1

Related Questions