Сбор JSON объектов с одинаковым значением ключа - PullRequest
0 голосов
/ 01 мая 2020

Я пытался решить проблему самостоятельно, но мне не удалось. Поэтому я решил обратиться за помощью.

У меня есть массив JSON объектов, подобных этому:

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

Я хочу собрать объекты с одинаковым значением ключа - в этом случае ключ города - в новом массиве, чтобы получить это:

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

Ответы [ 4 ]

2 голосов
/ 01 мая 2020

Это работа для .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)
1 голос
/ 01 мая 2020

Используйте loda sh, сгруппируйте, а затем добавьте в новый массив

 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>
1 голос
/ 01 мая 2020

Вы можете использовать сокращение до группы по полю, используя это поле в качестве ключа, а затем использовать Object.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')));
0 голосов
/ 01 мая 2020
const objArr = [
    {
        name: "Andrew",
        city: "London",
    },
    {
        name: "Edouard",
        city: "Paris",
    },
    {
        name: "Nathalie",
        city: "London",
    },
    {
        name: "Patrick",
        city: "London",
    },
    {
        name: "Mathieu",
        city: "Paris",
    },
];



// Gather all the different cities
let allCities = [];

objArr.forEach( _x => {

    let city = _x.city;

    if (! allCities.includes(city)) {
        allCities.push(city);
    };

});



// Format 1
/*
    {
        London: [
            { name: 'Andrew', city: 'London' },
            { name: 'Nathalie', city: 'London' },
            { name: 'Patrick', city: 'London' }
        ],
        Paris: [
            { name: 'Edouard', city: 'Paris' },
            { name: 'Mathieu', city: 'Paris' }
        ]
    }
*/

let newObjArr1 = {};

allCities.forEach( _city => {

    newObjArr1[_city] = objArr.filter( _x => {
        return _x.city === _city
    }); 

});

console.log( newObjArr1 );



// Format 2
/*
    [
        [
            { name: 'Andrew', city: 'London' },
            { name: 'Nathalie', city: 'London' },
            { name: 'Patrick', city: 'London' }
        ],
        [
            { name: 'Edouard', city: 'Paris' },
            { name: 'Mathieu', city: 'Paris' }
        ]
    ]
*/

let newObjArr2 = [];


for (let _i = 0; _i < allCities.length; _i ++) {

    let _city = allCities[_i];

    newObjArr2[_i] = objArr.filter( _x => {
        return _x.city === _city
    });     

};

console.log( newObjArr2 );


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...