Reputation: 2008
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:
First
or Third
, etc...
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
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
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