Как создать новый объект на основе массива объектов - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть объект списка стран, и я хочу организовать его логически

    const countries = {
        list: [
            {name: 'India', continent: 'Asia'},
            {name: 'China', continent: 'Asia'},
            {name: 'France', continent: 'Europe'},
            {name: 'Germany', continent: 'Europe'},
        ]
    }

Это желаемый результат

    const countriesSorted = {
        list: [
            {Asia: ['India', 'China']},
            {Europe: ['France', 'Germany']}
        ]
    }

Я выбрал уникальные континенты, используя Set и Spread но не знаю как go переслать

    const continentSet = new Set(countries.list.map(country=>country.continent))

    const continents = [...continentSet]

Ответы [ 6 ]

3 голосов
/ 26 февраля 2020

Вы можете использовать функцию reduce для группировки стран следующим образом:

const countries = {list: [{name: 'India', continent: 'Asia'},{name: 'China', continent: 'Asia'},{name: 'France', continent: 'Europe'},{name: 'Germany', continent: 'Europe'}]},
      countriesSorted = {list: Object.values(countries.list.reduce((a, {name, continent}) => {
            (a[continent] || (a[continent] = {[continent]: []}))[continent].push(name);
            return a;
          }, {}))
      };

console.log(countriesSorted);

Без стенограммы оценки короткого замыкания.

const countries = {list: [{name: 'India', continent: 'Asia'},{name: 'China', continent: 'Asia'},{name: 'France', continent: 'Europe'},{name: 'Germany', continent: 'Europe'}]},
      countriesSorted = {
        list: Object.values(countries.list.reduce((a, {name,continent}) => {
          if (!a[continent]) {
            a[continent] = {
              [continent]: []
            }
          }

          a[continent][continent].push(name);
          return a;
        }, {}))
      };

console.log(countriesSorted);
1 голос
/ 26 февраля 2020

Я бы попробовал вот так

const countries = {
    list: [
        { name: 'India', continent: 'Asia' },
        { name: 'China', continent: 'Asia' },
        { name: 'France', continent: 'Europe' },
        { name: 'Germany', continent: 'Europe' },
    ]
}

let sortedArr = []

for(let obj of countries.list){
    //If the continent has not been added already add it and assign new set with current country
    if(!sortedArr[obj.continent]) sortedArr[obj.continent] = new Set().add(obj.name)
    else sortedArr[obj.continent].add(obj.name)
}
console.log(sortedArr)
1 голос
/ 26 февраля 2020

Надеюсь, это поможет,

const countries = {
  list: [{
      name: 'India',
      continent: 'Asia'
    },
    {
      name: 'China',
      continent: 'Asia'
    },
    {
      name: 'France',
      continent: 'Europe'
    },
    {
      name: 'Germany',
      continent: 'Europe'
    },
  ]
}

const out = {};
for (const country of countries.list) {
  if (!Array.isArray(out[country.continent])) out[country.continent] = [];
  out[country.continent].push(country.name);
}

const countriesSorted = {
  list: []
};
for (const key in out) {
  countriesSorted.list.push({
    [key]: out[key]
  });
}

console.log(countriesSorted);
0 голосов
/ 26 февраля 2020

Это может помочь:

const countries = {
        list: [
            {name: 'India', continent: 'Asia'},
            {name: 'China', continent: 'Asia'},
            {name: 'France', continent: 'Europe'},
            {name: 'Germany', continent: 'Europe'},
        ]
    }
    const continents=[...new Set(countries.list.map(el=>el.continent))];
    var data={}
    continents.forEach(element => {
        data[element]=countries.list.filter(obj=>obj.continent===element).map(item=>item.name)
    });
    const countriesSorted = {
        list:data
    }
    console.log(countriesSorted)
0 голосов
/ 26 февраля 2020

Нужен рефакторинг для ясности, но он работает.

const countries = {
   list: [
 {name: 'India', continent: 'Asia'},
 {name: 'China', continent: 'Asia'},
 {name: 'France', continent: 'Europe'},
 {name: 'Germany', continent: 'Europe'},
   ]
}

// Get unique continents
const continents = Array.from(new Set(countries.list.map(c => c.continent)))

const sorted = { 
list: continents.map(c => 
  ({ [c]:  
     countries.list.map(co => 
        co.continent === c ? co.name : undefined)
   .filter(e => !!e) }))}

console.log(sorted)
0 голосов
/ 26 февраля 2020

Вот потенциальное решение. Я удалил вложенный список, так как он не был необходим для этого примера.

const list = [
        {name: 'India', continent: 'Asia'},
        {name: 'China', continent: 'Asia'},
        {name: 'France', continent: 'Europe'},
        {name: 'Germany', continent: 'Europe'}
]

//Initialise the object.
let continents = {};

//Initialise the continent with empty array.
list.forEach(el => {
    if (!continents[el.continent]) {
        continents[el.continent] = [];
    }
})

//Push the country name to the correct continent array.
list.forEach(el => {
    continents[el.continent].push(el.name);
})

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