Would be grateful for more smarter solutions for my code below. Using libraries like Lodash is ok, if it will allow to achieve more readable and optimized code. Thanks in advance.
const data = [
{ stock_id: 1, purchase_id: 11 },
{ stock_id: 1, purchase_id: 12 },
{ stock_id: 2, purchase_id: 20 },
{ stock_id: 2, purchase_id: 21 },
{ stock_id: 2, purchase_id: 22 },
{ stock_id: 3, purchase_id: 30 },
{ stock_id: 3, purchase_id: 31 },
];
const uid = [...new Set(data.map((el) => el.stock_id))];
const result = uid.map((uid_el) => ({
stock_id: uid_el,
purchase_id: data.filter(stock_el => stock_el.stock_id === uid_el).map((purc_el) => purc_el.purchase_id)
}));
console.log(result);
/* result
[
{"stock_id":1,"purchase_id":[11,12]},
{"stock_id":2,"purchase_id":[20,21,22]},
{"stock_id":3,"purchase_id":[30,31]}
]
*/
this is another solution
const data = [
{ stock_id: 1, purchase_id: 11 },
{ stock_id: 1, purchase_id: 12 },
{ stock_id: 2, purchase_id: 20 },
{ stock_id: 2, purchase_id: 21 },
{ stock_id: 2, purchase_id: 22 },
{ stock_id: 3, purchase_id: 30 },
{ stock_id: 3, purchase_id: 31 },
];
let newArray=[]
data.map(item=>{
if(!newArray.some(ele=>item.stock_id===ele.stock_id)){
item.purchase_id=[item.purchase_id]
newArray.push(item)
}
else{
let {stock_id,purchase_id}=item
let index=newArray.findIndex(i=>i.stock_id===stock_id)
newArray[index].purchase_id=[...newArray[index].purchase_id,purchase_id]
}
})
console.log(newArray)