Lodash: Как получить уникальные значения из массива объектов, а затем отсортировать эти объекты по этим уникальным значениям? - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь использовать Lodash для получения уникальных значений из массива объектов, а затем использовать эти значения в качестве ключей для сортировки массива объектов.Мне удалось найти решение, однако я не уверен, что это самый сложный, читаемый или эффективный способ сделать это.

Используя _.uniq и _.map, я смог получить уникальные значения country от каждого artist.Затем я просмотрел эти значения и отфильтровал по ним artists.

let artists = [
  { name: "Bob Jones", country: "Australia"},
  { name: "Jane Smith", country: "Australia"},
  { name: "James Good", country: "USA"},
  { name: "Jeremy Bond", country: "Japan"},
]

let countries = _.uniq(_.map(artists, 'country'))
// ["Australia", "USA", "Japan"]

let res = []

for (let i = 0; i < countries.length; i++) {
  let country = countries[i]
  let obj = {
    country: country,
    artists: artists.filter(artist => artist.country === country)
  }

  res.push(obj)
}

console.log(res)
/* [
  { country: "Australia",
    artists: [
      { name: "Bob Jones", country: "Australia"},
      { name: "Jane Smith", country: "Australia"}
    ]
  },
  { country: "USA",
    artists: [
      { name: "James Good", country: "USA"}
    ]
  },
  { country: "Japan",
    artists: [
      { name: "Jeremy Bond", country: "Japan"}
    ]
  }
]
*/

Есть ли какая-либо функция Lodash, которую я могу использовать вместо назначения цикла и объекта?

1 Ответ

3 голосов
/ 10 июля 2019

Используйте _.groupBy(), чтобы собрать художников для объекта { [country]: artists }, а затем используйте _.map() для преобразования объекта в массив:

const artists = [
  { name: "Bob Jones", country: "Australia"},
  { name: "Jane Smith", country: "Australia"},
  { name: "James Good", country: "USA"},
  { name: "Jeremy Bond", country: "Japan"},
]

const result = _.map(
  _.groupBy(artists, 'country'),
  (artists, country) => ({ country, artists })
)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И то же решение с lodash / fp - использование _.flow() для генерации функции:

const { flow, groupBy, map, head } = _

const byCountry = flow(
  groupBy('country'),
  map(artists => ({ country: head(artists).country, artists }))
)

const artists = [
  { name: "Bob Jones", country: "Australia"},
  { name: "Jane Smith", country: "Australia"},
  { name: "James Good", country: "USA"},
  { name: "Jeremy Bond", country: "Japan"},
]

const result = byCountry(artists)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...