Сортировка массива объектов с помощью lodash: не работает - PullRequest
1 голос
/ 17 апреля 2019

У меня есть массив, который похож на этот (он имеет больше объектов, но структура та же):

[
  {
      especiality: "surgery",
      users: [
          {
              id: "182",
              country: "Colombia",
              province: "Bogota",
              telephone: "211112212",
              neighbourhood: "La Santa"
              region: "South",
          },
          {
            id: "182",
            country: "Venezuela",
            province: "Caracas",
            telephone: "322323333",
            region: "North",
        },
        {
          id: "183",
          country: "Brasil",
          telephone: "23232333",
          neighbourhood: "Santos"
          region: "South",
      },
      ]
  },

Я хочу, чтобы адреса, если идентификатор тот же, составляли одинодин массив (мне нужно отобразить эти элементы).Прогноз должен выглядеть следующим образом:

user: [{id: 182, locations[(if they exist)               
              country: "Colombia",
              province: "Bogota",
              telephone: "211112212",
              neighbourhood: "La Santa"
              region: "South"], [country: "Venezuela",
            province: "Caracas",
            telephone: "322323333",
            region: "North"],}]

Я сейчас пробую это, но это не работает вообще:

getGroups = test => {
  _.chain(test)
  .groupBy("id")
  .toPairs()
  .map(item => _.zipObject(["id", "country", "province", "neighbourhood", "region"], item))
  .value();
  return test
  }

Что я делаю не так и как могуЯ учитываю значения, которые могут быть недоступны во всех объектах?

1 Ответ

1 голос
/ 17 апреля 2019

После группировки элементов по id сопоставьте группы и создайте объект с id, а элементы группы как locations. Сопоставьте местоположения и используйте _.omit(), чтобы удалить из них id.

Я не уверен, как вы хотите обрабатывать внешний массив. Я использовал _.flatMap() для получения единого массива пользователей, но есть опция с комментариями, если вам нужно сохранить исходную структуру.

getGroups = test =>
  _(test)
  .groupBy("id")
  .map((locations, id) => ({
    id,
    locations: _.map(locations, l => _.omit(l, 'id'))
  }))
  .value();

const data = [{"especiality":"surgery","users":[{"id":"182","country":"Colombia","province":"Bogota","telephone":"211112212","neighbourhood":"La Santa","region":"South"},{"id":"182","country":"Venezuela","province":"Caracas","telephone":"322323333","region":"North"},{"id":"183","country":"Brasil","telephone":"23232333","neighbourhood":"Santos","region":"South"}]}];

const result = _.flatMap(data, ({ users }) => getGroups(users));

/** maintains the original structure
const result = _.map(data, ({ users, ...rest }) => ({
  ...rest,
  users: getGroups(users)
}));
**/

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