Skip to the content.

Group array of JavaScript objects by duplicate key-value pair/pairs

Ravi Kumar
Jan 24, 2022

This is implementation to group by single/multiple properties in one.

Implementation

const groupBy = (keys,array) =>
    array.reduce((objectsByKeyValue, obj) => {
      const value = keys.map(key => obj[key]).join('-');
      objectsByKeyValue[value] = (objectsByKeyValue[value] || []).concat(obj);
      return objectsByKeyValue;
    }, {});
  
const groupByKeyValue= (groupedArray)=>{
    let answerArray = []
    for (var [key, value] of Object.entries(groupedArray)) {
      value.forEach((arrayElement)=>{
        answerArray.push(arrayElement);
      }) 
    }
    return answerArray;
};

Usage

const cars = [
  { brand: 'Peugot', produced: '2021', color: 'yellow' },
  { brand: 'Audi', produced: '2016', color: 'black' },
  { brand: 'Ford', produced: '2016', color: 'red' },
  { brand: 'Audi', produced: '2017', color: 'white' },
  { brand: 'Ford', produced: '2016', color: 'white' },
  { brand: 'Audi', produced: '2016', color: 'green' },
  { brand: 'Peugot', produced: '2018', color: 'white' },
  { brand: 'Ford', produced: '2020', color: 'blue' },
];

const groupByBrand = groupByKeyValue(groupBy(['brand'],cars));
const groupByColor = groupByKeyValue(groupBy(['brand'],cars));
const groupByYear = groupByKeyValue(groupBy(['brand'],cars));
const groupByBrandAndYear = groupByKeyValue(groupBy(['brand','produced'],cars));

console.log("By Brand \n",groupByBrand);
console.log("By Color \n",groupByColor);
console.log("By Year \n",groupByYear);
console.log("By Brand And Year \n",groupByBrandAndYear)

Output

By Brand 
 [ { brand: 'Peugot', produced: '2021', color: 'yellow' },
  { brand: 'Peugot', produced: '2018', color: 'white' },
  { brand: 'Audi', produced: '2016', color: 'black' },
  { brand: 'Audi', produced: '2017', color: 'white' },
  { brand: 'Audi', produced: '2016', color: 'green' },
  { brand: 'Ford', produced: '2016', color: 'red' },
  { brand: 'Ford', produced: '2016', color: 'white' },
  { brand: 'Ford', produced: '2020', color: 'blue' } ]
By Color 
 [ { brand: 'Peugot', produced: '2021', color: 'yellow' },
  { brand: 'Audi', produced: '2016', color: 'black' },
  { brand: 'Ford', produced: '2016', color: 'red' },
  { brand: 'Audi', produced: '2017', color: 'white' },
  { brand: 'Ford', produced: '2016', color: 'white' },
  { brand: 'Peugot', produced: '2018', color: 'white' },
  { brand: 'Audi', produced: '2016', color: 'green' },
  { brand: 'Ford', produced: '2020', color: 'blue' } ]
By Year 
 [ { brand: 'Audi', produced: '2016', color: 'black' },
  { brand: 'Ford', produced: '2016', color: 'red' },
  { brand: 'Ford', produced: '2016', color: 'white' },
  { brand: 'Audi', produced: '2016', color: 'green' },
  { brand: 'Audi', produced: '2017', color: 'white' },
  { brand: 'Peugot', produced: '2018', color: 'white' },
  { brand: 'Ford', produced: '2020', color: 'blue' },
  { brand: 'Peugot', produced: '2021', color: 'yellow' } ]
By Brand And Year 
 [ { brand: 'Peugot', produced: '2021', color: 'yellow' },
  { brand: 'Audi', produced: '2016', color: 'black' },
  { brand: 'Audi', produced: '2016', color: 'green' },
  { brand: 'Ford', produced: '2016', color: 'red' },
  { brand: 'Ford', produced: '2016', color: 'white' },
  { brand: 'Audi', produced: '2017', color: 'white' },
  { brand: 'Peugot', produced: '2018', color: 'white' },
  { brand: 'Ford', produced: '2020', color: 'blue' } ]

back