Изменить порядок данных результата _.groupBy () - PullRequest
1 голос
/ 10 мая 2019

Все, это моя структура массива

let data = [
    {"name": "ragupathi", "siteID": 10},
    {"name": "abi","siteID": 13},
    {"name": "mahesh", "siteID": 12},
]

я хочу, чтобы данные группы основывались на siteID, поэтому я использую groupBy siteID

let sample = _.groupBy(данные, 'siteID');

текущий вывод:

{
  "10": [
    {
      "name": "ragupathi",
      "siteID": 10
    }

  ],
  "12": [
    {
      "name": "mahesh",
      "siteID": 12
    }
  ],
  "13": [
    {
      "name": "abi",
      "siteID": 13
    }
  ]
}

Но я ожидаю имя выхода в порядке ASC

{
  "13": [
    {
      "name": "abi",
      "siteID": 13
    }
  ],
  "10": [
    {
      "name": "mahesh",
      "siteID": 12
    }
  ],
  "12": [
   {
      "name": "ragupathi",
      "siteID": 10
    }
   ],
}
  1. GroupBy SiteID
  2. Группированный вывод на основе свойств имени объекта

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Так как порядок реквизита не гарантирован, вы должны использовать Map или другие методы, чтобы получить необходимую сортировку и вывод.

Вы можете использовать Array.sort, Array.forEach и Карта , например:

let data = [{"name": "ragupathi", "siteID": 10},{"name": "abi", "siteID": 13},{"name": "abi","siteID": 13},{"name": "mahesh", "siteID": 12},{"name": "abi", "siteID": 13},{"name": "abi", "siteID": 13},{"name": "ragupathi", "siteID": 10}], 
map = new Map()

data
  .sort((a,b) => b.siteID - a.siteID)
  .forEach(x => map.set(x.siteID, [...(map.get(x.siteID) || []), x] || [x]))

console.log(map) // The map object output in your browser console
console.log(Array.from(map.values())) // The siteIds in array form    

Как только они появятся в объекте map, вы сможете легко получить доступ к группам по siteID, например, map.get(13), и вы получите массив сгруппированных элементов.для siteID 13.

Вы также всегда можете получить порядок, в котором вы сохранили ключи на карте, с помощью метода Map.keys () .

0 голосов
/ 10 мая 2019

Порядок свойств для объектов в ES6:

  • Ключи, являющиеся целочисленными индексами, в порядке возрастания чисел .
  • Затем все остальные строковые ключи в том порядке, в котором они были добавлены к объекту.
  • Наконец, все символьные ключи в том порядке, в котором они были добавлены к объекту.

Ссылка

Выходной объект имеет целочисленные ключи. Независимо от того, в каком порядке вы вставляете ключи к объекту, он всегда будет напечатан в следующем порядке: 10 -> 12 -> 13

Вы можете использовать Map в качестве выхода. Map объекты содержат пары ключ-значение и запоминают исходный порядок вставки ключей

Создайте объект с каждым уникальным siteID в качестве ключа и массив с единственным объектом в качестве значения. Затем sort записей объекта на основе name каждого объекта. Затем создайте Map из этих отсортированных записей (проверьте вывод в консоли браузера. Фрагменты стека отображают Map как пустой объект)

let data = [
    {"name": "ragupathi", "siteID": 10},
    {"name": "abi", "siteID": 13},
    {"name": "abi","siteID": 13},
    {"name": "mahesh", "siteID": 12},
    {"name": "abi", "siteID": 13},
    {"name": "abi", "siteID": 13},
    {"name": "ragupathi", "siteID": 10}
]

const uniqueSiteGroups = {};
data.forEach(o => uniqueSiteGroups[o.siteID] = [o])

const sortedEntries = Object.entries(uniqueSiteGroups)
                        .sort((a, b) => a[1][0].name.localeCompare(b[1][0].name))

const map = new Map(sortedEntries)

console.log(map) // check the browser's console
...