lodash groupBy正在更改我的收藏夹中的顺序

问题描述 投票:0回答:2

我有一个数组:

  { 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开头吗?

如何保持收藏顺序?

javascript lodash traversal
2个回答
1
投票

这就是ordered in EcmaScript 1]的属性:如果属性名称是自然数(十进制数字,直至一定限制)的表示形式,则这些属性将按数字顺序排在其他任何属性之前。

请注意,这与lodash无关,但与EcmaScript本身有关。

要强制执行命令,您不应将结果变成普通对象,而应使用成对的数组,其中成对的第一个值是(数字)属性,第二个是实际值(在您的情况下为对象数组) 。

在普通的JS中,您可以使用以下方式创建基于对的结构:

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

如果您确实需要普通对象格式,则可以考虑在属性前面加上一些非数字字符。


1 对象属性的“顺序”有很多细微差别。参见Does ES6 introduce a well-defined order of enumeration for object properties?以获得更详细的说明


0
投票

js中的对象未排序,这意味着在向对象添加元素(键+值)后,其位置将由其键上的随机函数定义(它从一个prog-lang变为另一个)其他可能的解决方案是使用数组数组。主数组将代表整个组,而每个子数组将代表一个特定的组。

© www.soinside.com 2019 - 2024. All rights reserved.