Как сделать groupBy с RxJS и получить результаты в конкретном массиве? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть объект со следующими свойствами:

{
    title: 'Test',
    places: [
      {
        id: 1,
        longitude: 48.8469511,
        latitute: 2.3077989,
        address: 'Pont de Bir-Hakeim',
        city: {name: 'Paris', id: 1}
      },
      {
        id: 2,
        longitude: 48.855225,
        latitute: 2.288048,
        address: 'Palais-Musée Galliera, 10 avenue Pierre-1er-de-Serbie',
        city: {name: 'Paris', id: 1}
      },
      {
        id: 3,
        longitude: 50.8283315,
        latitute: -115.2608429,
        address: 'Fortress Moutain',
        city: {name: 'Calgary', id: 2}
      }
    ]
}

Вот результат, который я хочу:

[
  {
    id: 1,
    name: 'Paris'
  },
  {
    id: 2,
    name: 'Calgary'
  },
]

Как мне добиться этого с помощью groupBy map reduce?Вот что я попробовал:

   return from(movie.places).pipe(
      groupBy(place => place.city.name),
      mergeMap(place => place.pipe(map(obj => obj.city.name))),
      toArray()
   );

Который производит:

['Paris', 'Paris', 'Calgary']

В моей голове не очень понятно, как использовать groupBy, map, mergeMap,toArray вместе ... Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

В одной строке, я думаю, и просто используя toArray, map, distinct операторов, вы можете сделать:

return from(movie.places).pipe(map(place => place.city), distinct(entry => entry.id),toArray());

Демо

0 голосов
/ 24 декабря 2018

вы можете сделать что-то вроде этого:

source$.pipe(
  map(state => state.places), // transform your source object to list of places.
  // Transform your list of place by list of city, then reduce it for unduplicate it.
  map(state => state.map(e => e.city).reduce( ( acc, cur ) => [
    ...acc.filter( ( obj ) => obj.id !== cur.id ), cur
  ], [] ))
).subscribe(console.log);

Я разбил на две разные карты, чтобы сохранить мой код, вы можете легко объединить его в одну карту, если хотите.

этот код также небезопасен для очень большого сбора данных, предпочитайте normalizr , если вы хотите эффективно работать с большими данными.

живой код

источник для уникального массива базы объектов с идентификатором

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