2014-12-04 55 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對象未訂購數據集

但是,每個組內的特定項目將保留其排序。正如前面所說,只是這些小組會被搞砸,因爲他們是對象的關鍵,不能被命令。