chalatum
chalatum

Reputation: 97

Gathering JSON objects with same key value

I tried to solve the problem on my own but I did not manage to. So I decided to ask for help.

I've got an array of JSON objects like this:

const objArr = [
 {
  name: 'Andrew',
  city: 'London'
 },
 {
  name: 'Edouard',
  city: 'Paris'
 },
 {
  name: 'Nathalie',
  city: 'London'
 },
 {
  name: 'Patrick',
  city: 'London'
 },
 {
  name: 'Mathieu',
  city: 'Paris'
 }
];

I want to gather objects with same key value - in that case the city key - in a new array to obtain this:

const newObjArr = [
 [{
  name: 'Andrew',
  city: 'London'
 },
 {
  name: 'Nathalie',
  city: 'London'
 },
{
  name: 'Patrick',
  city: 'London'
 }],
 [{
  name: 'Edouard',
  city: 'Paris'
 },
 {
  name: 'Mathieu',
  city: 'Paris'
 }]
];

Upvotes: 0

Views: 2055

Answers (3)

user12407908
user12407908

Reputation:

This is a job for .reduce().

const objArr = [
  {name: 'Andrew', city: 'London'},
  {name: 'Edouard', city: 'Paris'},
  {name: 'Nathalie', city: 'London'},
  {name: 'Patrick', city: 'London'},
  {name: 'Mathieu', city: 'Paris'}
];

// Object of arrays
const result = objArr.reduce((acc, obj) => {
  return {...acc, [obj.city]: [...acc[obj.city] || [], obj]}
}, {})

// Array of arrays
const result2 = Object.values(result);

console.log(result2)

Upvotes: 2

jeprubio
jeprubio

Reputation: 18002

You can use reduce to group by a field using that field as the key and then use Object.values if you really just want the values:

const objArr = [ { name: 'Andrew', city: 'London' }, { name: 'Edouard', city: 'Paris' }, { name: 'Nathalie', city: 'London' }, { name: 'Patrick', city: 'London' }, { name: 'Mathieu', city: 'Paris' } ];

var groupBy = function(array, k) {
  return array.reduce(function(acc, cur) {
    (acc[cur[k]] = acc[cur[k]] || []).push(cur);
    return acc;
  }, {});
};

console.log(Object.values(groupBy(objArr, 'city')));

Upvotes: 1

Cagri Tacyildiz
Cagri Tacyildiz

Reputation: 17610

Use lodash group by and then add to new array

 var objArr = [ { name: 'Andrew', city: 'London' }, { name: 'Edouard', city: 'Paris' }, { name: 'Nathalie', city: 'London' }, { name: 'Patrick', city: 'London' }, { name: 'Mathieu', city: 'Paris' } ]
 
var grouped = _.mapValues(_.groupBy(objArr, 'city'),
                          clist => clist.map(city => _.omit(city, 'city')));

 var result=[]
 for (const [key, value] of Object.entries(grouped)) {
  
  var array=[]
  value.forEach(x=>{
     array.push({ name: x.name, city:key })
  })
   result.push(array);
}
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Upvotes: 1

Related Questions