упрощение и сортировка создания нового массива из существующего - PullRequest
0 голосов
/ 20 января 2019

У меня есть массив объектов, таких как:

[
   {country: 'a', region: 1}
   {country: 'a', region: 2}
   {country: 'a', region: 3}
   {country: 'b', region: 4}
   {country: 'b', region: 5}
   {country: 'c', region: 6}
   {country: 'd', region: 7}
   {country: 'e', region: 8}
]

Я хочу получить такой массив:

[
   {country: 'a', region: [1, 2, 3]}
   {country: 'b', region: [4, 5]}
   {country: 'c', region: [6]}
   {country: 'd', region: [7]}
   {country: 'e', region: [8]}
]

Я пробовал следующее, но я застрял в той части, где я хочу отправить результат в существующий массив byCountry ...

Кроме того, я чувствую, что фильтр может быть не самой лучшей функцией для этого, и, вероятно, он может быть намного менее сложным, чем то, как я его написал.

 let byCountry = []

    regions.forEach( (region) => {
      const filter = byCountry.filter( country => country.country === region.country )

      if (filter.length > 0) {
        const filteredCountry = filter[0]['country']
        const result = _.find(byCountry, country => {
          return country.country === filteredCountry
        })
// stuck here

      } else {
        const newCountry = {
          country: region.country,
          regions: [region.region],
        }

        byCountry.push(newCountry)
      }
    })

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Вы можете использовать reduce и Object.values следующим образом:

Цель состоит в том, чтобы создать объект с каждым значением country в качестве ключа и{country: 'a', region: []} как значение.Затем просто используйте Object.values, чтобы получить вывод.

const regions=[{country:'a',region:1},{country:'a',region:2},{country:'a',region:3},{country:'b',region:4},{country:'b',region:5},{country:'c',region:6},{country:'d',region:7},{country:'e',region:8}]

const merged = regions.reduce((acc, {country,region}) => 
  ((acc[country] = acc[country] || {country, region: []}).region.push(region), acc)
, {})

console.log(Object.values(merged))

Вот упрощенная версия приведенного выше кода:

const regions = [{country:'a',region:1},{country:'a',region:2},{country:'a',region:3},{country:'b',region:4},{country:'b',region:5},{country:'c',region:6},{country:'d',region:7},{country:'e',region:8}]

const merged = regions.reduce((acc, {country,region}) => {
  acc[country] = acc[country] || {country, region: []};
  acc[country].region.push(region);
  return acc;
}, {})

console.log(Object.values(merged))
0 голосов
/ 20 января 2019

Соберите значения на карту, используя Array.reduce(), затем преобразуйте обратно в объект, используя Array.from():

const data = [{"country":"a","region":1},{"country":"a","region":2},{"country":"a","region":3},{"country":"b","region":4},{"country":"b","region":5},{"country":"c","region":6},{"country":"d","region":7},{"country":"e","region":8}]
  
const result = Array.from(
  data.reduce((m, { country, region }) => 
    m.set(country, [...(m.get(country) || []), region])
  , new Map),
  ([country, region]) => ({ country, region })
)

console.log(result)
0 голосов
/ 20 января 2019

Вы можете просто преобразовать свой массив в хэш-карту, которая отображает страны на несколько регионов {<country>: Array<regions>}, а затем преобразовать его обратно в массив:

const records = [
      {country: 'a', region: 1},
      {country: 'a', region: 2},
      {country: 'a', region: 3},
      {country: 'b', region: 4},
      {country: 'b', region: 5},
      {country: 'c', region: 6},
      {country: 'd', region: 7},
      {country: 'e', region: 8}
    ];

const regionsByCountry = new Map();

records.forEach(record => {
  if (!regionsByCountry.has(record.country)) {
    regionsByCountry.set(record.country, []);
  }

  regionsByCountry.get(record.country).push(record.region);
});

const merged = Array.from(regionsByCountry)
                    .map(([country, region]) => ({country,region}));
                    
console.log(merged)

Вы можете использовать современный Map с читаемым API или литералом простого объекта {}.

Документы для карты: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

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