2014-12-04 53 views
2

我简单对象的数组,看起来像下面这样:维护使用下划线的GROUPBY()排序

var objects =[ 
    { 
     "group": "05", 
     "format": "Legacy", 
     "active": false 
    }, 
    { 
     "group": "05", 
     "format": "Legacy", 
     "active": false 
    }, 
    { 
     "group": "23", 
     "format": "Legacy", 
     "active": true 
    } 
] 

我想用下划线的GROUPBY功能组这些项目,同时保持顺序属性被分组。

当调用_.groupBy(objects, 'group'),结果是这样的:

{ 
    "23": [ 
    { 
     "group": "23", 
     "format": "Legacy", 
     "active": true 
    } 
    ], 
    "05": [ 
    { 
     "group": "05", 
     "format": "Legacy", 
     "active": false 
    }, 
    { 
     "group": "05", 
     "format": "Legacy", 
     "active": false 
    } 
    ] 
} 

是否有特定的原因,“23”的分组被放置在“05”之前生成的对象?它似乎并不尊重自然顺序或分组数组的顺序。

+0

对象不有一个命令。 – Bergi 2014-12-04 17:41:44

回答

3

可以考虑_.groupBy一个哈希表的结果,因为在JS对象通常是作为属性值等的恒定时间检索无序哈希表来实现

将JavaScript散列表实现应不保证按键的排列顺序,所以在使用它们时你不能指望排序。

@mu的评论太短,这并不意味着在将来某些ES *实现将不会有有序的哈希表。

+0

有道理,谢谢。 – 2014-12-04 17:56:17

+0

不用客气;) – 2014-12-04 17:57:58

+2

一些键/值数据结构是散列表,并且是有序的(例如Ruby的'Hash'),大多数都没有排序。 JavaScript规范没有说明Object是如何实现的,并没有说Object是被排序的(参考[在这里](http://stackoverflow.com/a/22845062/479863))。 '_.groupBy'返回一个'Object',所以'_GroupBy'的返回值不保证是有序的。 – 2014-12-04 18:02:15

2

您错过了主要观点:JavaScript对象未订购数据集

但是,每个组内的特定项目将保留其排序。正如前面所说,只是这些小组会被搞砸,因为他们是对象的关键,不能被命令。