我有一个数组:
{ 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开头吗?
如何保持收藏顺序?
这就是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?以获得更详细的说明
js中的对象未排序,这意味着在向对象添加元素(键+值)后,其位置将由其键上的随机函数定义(它从一个prog-lang变为另一个)其他可能的解决方案是使用数组数组。主数组将代表整个组,而每个子数组将代表一个特定的组。