loda sh группа меняет порядок в моей коллекции - PullRequest
0 голосов
/ 10 января 2020

У меня есть массив:

  { date: '25', value: '1410' },
  { date: '25', value: '1132' },
  { date: '26', value: '1482' },
  { date: '26', value: '3546' },
  { date: '27', value: '3748' },
  { date: '27', value: '3482' },
  { date: '28', value: '3164' },
  { date: '28', value: '2626' },
  { date: '29', value: '1110' },
  { date: '29', value: '948' },
  { date: '01', value: '1260' },
  { date: '01', value: '1228' },
  { date: '02', value: '1120' },
  { date: '02', value: '1056' },
  { date: '03', value: '1214' },
  { date: '04', value: '1100' },
  { date: '05', value: '1624' },
  { date: '06', value: '1544' },
  { date: '07', value: '1846' },
  { date: '08', value: '1370' },
  { date: '09', value: '1262' },
  { date: '10', value: '542' },
  { date: '10', value: '492' },

Когда я делаю:

 let groups = _.groupBy(conso, 'date');

Я получаю результат сгруппированы, но я теряю порядок, первый элемент не 25, это 10:

{
  '10': [
    { date: '10', value: '542' },
    { date: '10', value: '492' },
    ....
  ]
}

Это разыскиваемое поведение? Если сортировка по алфавиту, не должна ли она начинаться с 01?

Как мне сделать, чтобы сохранить порядок моей коллекции?

Ответы [ 2 ]

1 голос
/ 10 января 2020

Таким образом свойства упорядочиваются в EcmaScript 1 : когда имя свойства является каноническим строковым представлением значения индекса массива (т. Е. Десятичного числа) цифры, до 2 32 -1 и без дополненных нулей), затем они сортируются в числовом порядке перед любыми другими свойствами.

Обратите внимание, что это не относится к loda sh , но для самого EcmaScript.

Для обеспечения порядка вы должны сделать свой результат не простым объектом, а массивом с парами, где первое значение в паре является свойством (цифра c), и второе фактическое значение (массив объектов в вашем случае).

В простом JS вы можете создать эту парную структуру с помощью:

let map = new Map(conso.map(o => [o.date, []]));
conso.forEach(o => map.get(o.date).push(o));
let result = [...map];

Если вам действительно нужен простой формат объекта, тогда вы могли бы рассмотреть префикс свойств с некоторыми не-ди git символ.


1 Есть много нюансов в «порядке» свойств объекта , См. Вводит ли ES6 четко определенный порядок перечисления для свойств объекта? для более подробного объяснения

0 голосов
/ 10 января 2020

объект в js не отсортирован, это означает, что после добавления элемента (ключ + значение) к объекту его положение будет определяться случайной функцией на его ключе (он меняется с одного прог-языка на другой) )
другое возможное решение - использование массива массивов. где основной массив будет представлять целые группы, а каждый подмассив будет представлять определенную c группу.

мы можем получить ее простой сортировкой поверх текущих результатов.

var conso = [{ date: '25', value: '1410' },
  { date: '25', value: '1132' },
  { date: '26', value: '1482' },
  { date: '26', value: '3546' },
  { date: '27', value: '3748' },
  { date: '27', value: '3482' },
  { date: '28', value: '3164' },
  { date: '28', value: '2626' },
  { date: '29', value: '1110' },
  { date: '29', value: '948' },
  { date: '01', value: '1260' },
  { date: '01', value: '1228' },
  { date: '02', value: '1120' },
  { date: '02', value: '1056' },
  { date: '03', value: '1214' },
  { date: '04', value: '1100' },
  { date: '05', value: '1624' },
  { date: '06', value: '1544' },
  { date: '07', value: '1846' },
  { date: '08', value: '1370' },
  { date: '09', value: '1262' },
  { date: '10', value: '542' },
  { date: '10', value: '492' },];
let groups = _.groupBy(conso, 'date');
/// create an array of the original sorting dates
let sorting = _.map(conso, 'date')
// sort the group values (arrays) by their first element's date
// compare its value to the original solution date.
let finalSolution = _.sortBy(
        Object.values(groups), 
        (k) => sorting.indexOf(k[0].date)
        )

вы можете узнать больше о js сортировке ключей объекта здесь

...