Группировка значений в массив по ключам javascript

275
24 февраля 2017, 02:41

Есть массив:


[{
   continent: 'Europa', 
   country: 'Russia', 
   region: 'Moskovska obl'
},
{
   continent: 'Europa', 
   country: 'Russia', 
   region: 'Tumenskaya obl'
},
{
   continent: 'North America', 
   country: 'USA', 
   region: 'Toronto'
},
{
   continent: 'North America', 
   country: 'USA', 
   region: 'Texas'
}]

Необходимо преобразовать в структуру:

[ { continent { name: 'Europa', countries:[{ name: 'Russia', regions: [{ name: 'Moskovska obl' }, { name: 'Tumenskaya obl' }] }] } }, { continent { name: 'North America', countries:[{ name: 'USA', regions: [{ name: 'Toronto' }, { name: 'Texas' }] }] } } ]

Можете подсказать как сделать преобразование?

Answer 1

С помощью Array.prototype.reduce и промежуточных словарей:

{ 
     let data = [ 
          {continent: 'Europa', country: 'Russia', region: 'Moskovska obl'}, 
          {continent: 'Europa', country: 'Russia', region: 'Tumenskaya obl'}, 
          {continent: 'North America', country: 'USA', region: 'Toronto'}, 
          {continent: 'North America', country: 'USA', region: 'Texas'} 
     ]; 
 
     let continents = {}; 
     let countries = {}; 
     let regions = {}; 
 
     let grouped = data.reduce((res, reg) => { 
          if (!res.continents) res.continents = []; 
          if (!continents[reg.continent]) { 
               let continent = {name: reg.continent, countries: []}; 
               res.continents.push(continent); 
               continents[reg.continent] = continent; 
          } 
          if (!countries[reg.country]) { 
               let country = {name: reg.country, regions: []}; 
               continents[reg.continent].countries.push(country); 
               countries[reg.country] = country; 
          } 
          if (!regions[reg.region]) { 
               let region = {name: reg.region}; 
               countries[reg.country].regions.push(region); 
               regions[reg.region] = region; 
          } 
          return res; 
 
     }, {}); 
 
     console.log(grouped) 
}

READ ALSO
BD Chrome Extensions

BD Chrome Extensions

Какую базу данных лучше всего использовать для chrome extensions и возможно ли вообще это? Я хочу сделать базу данных слов и выбирать потом их по части...

233
ajax поиск по xml файлу

ajax поиск по xml файлу

ЗдравствуйтеУ меня следующая задача

216
Не воспринимает переменную

Не воспринимает переменную

Строю диаграммуТак не работает

169
генерация разметки Jquery

генерация разметки Jquery

привет есть код

267