VeironiOttan
VeironiOttan

Reputation: 15

How to first combine properties of an object then remove the duplicates in an array of objects using Javascript

I have an array of objects here:

const arr = [
  { id: 1, name: "test1", quantity:1 },
  { id: 2, name: "test2", quantity:1 },
  { id: 2, name: "test3", quantity:1 },
  { id: 3, name: "test4", quantity:1 },
  { id: 4, name: "test5", quantity:1 },
  { id: 5, name: "test6", quantity:1 },
  { id: 5, name: "test7", quantity:1 },
  { id: 6, name: "test8", quantity:1 }
];

I want to add quantities of the duplicate objects together before removing them

So the result is:

const arr = [
  { id: 1, name: "test1", quantity:1 },
  { id: 2, name: "test3", quantity:2 },
  { id: 3, name: "test4", quantity:1 },
  { id: 4, name: "test5", quantity:1 },
  { id: 5, name: "test6", quantity:2 },
  { id: 6, name: "test8", quantity:1 }
];

I have seen variations of it done removing duplicates using map or reduce but I haven't seen anything that can what I want to accomplish in an eloquent way without using too many loops.

I have been thinking about how to best accomplish this all day and haven't found anything, any help would be appreciated

Upvotes: 0

Views: 76

Answers (3)

Siva Kondapi Venkata
Siva Kondapi Venkata

Reputation: 11001

Using forEach loop and build object with aggregated quantity count.

const convert = (arr) => {
  const res = {};
  arr.forEach(({ id, ...rest }) =>
    res[id] ? (res[id].quantity += 1) : (res[id] = { id, ...rest })
  );
  return Object.values(res);
};

const arr = [
  { id: 1, name: "test1", quantity: 1 },
  { id: 2, name: "test2", quantity: 1 },
  { id: 2, name: "test3", quantity: 1 },
  { id: 3, name: "test4", quantity: 1 },
  { id: 4, name: "test5", quantity: 1 },
  { id: 5, name: "test6", quantity: 1 },
  { id: 5, name: "test7", quantity: 1 },
  { id: 6, name: "test8", quantity: 1 },
];

console.log(convert(arr));

Upvotes: 0

Andrew Arthur
Andrew Arthur

Reputation: 1603

const arr = [
    { id: 1, name: "test1", quantity: 1 },
    { id: 2, name: "test2", quantity: 1 },
    { id: 2, name: "test3", quantity: 1 },
    { id: 3, name: "test4", quantity: 1 },
    { id: 4, name: "test5", quantity: 1 },
    { id: 5, name: "test6", quantity: 1 },
    { id: 5, name: "test7", quantity: 1 },
    { id: 6, name: "test8", quantity: 1 }
];

var result = arr.reduce(function (r, a) {
    r[a.id] = r[a.id] || { id: a.id, quantity: 0, name: a.name };
    r[a.id].quantity += a.quantity;
    return r;
}, Object.create(null));

console.log(JSON.stringify(result));

Upvotes: 0

Unmitigated
Unmitigated

Reputation: 89294

You can use reduce with an object to store the element with each id.

const arr = [
  { id: 1, name: "test1", quantity:1 },
  { id: 2, name: "test2", quantity:1 },
  { id: 2, name: "test3", quantity:1 },
  { id: 3, name: "test4", quantity:1 },
  { id: 4, name: "test5", quantity:1 },
  { id: 5, name: "test6", quantity:1 },
  { id: 5, name: "test7", quantity:1 },
  { id: 6, name: "test8", quantity:1 }
];
const res = Object.values(
  arr.reduce((acc,curr)=>{
  acc[curr.id] = acc[curr.id] || {...curr, quantity: 0};
  acc[curr.id].quantity += curr.quantity;
  return acc;
  }, {})
);
console.log(res);

Upvotes: 2

Related Questions