使用下划线的groupBy()维护排序顺序

时间:2014-12-04 17:39:15

标签: javascript underscore.js

我有一组简单的对象,如下所示:

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'之前被放置在结果对象中它似乎不尊重自然排序或被分组的数组的顺序。

4 个答案:

答案 0 :(得分:3)

您可以考虑_.groupBy哈希表的结果,因为JS中的对象通常被实现为无序哈希表,用于持续时间检索属性值等。

Javascript哈希表实现不应该保证密钥的排序顺序,因此在使用时不能依赖排序。

根据@mu的评论太短,这并不意味着将来有些ES *实现没有订购哈希表。

答案 1 :(得分:2)

您遗漏了要点: JavaScript对象不是有序数据集

但是,每个组中的特定项目将保留其顺序。只是群体会搞砸,因为如前所述,它们是对象的关键,无法订购。

答案 2 :(得分:1)

它返回一个失去原始顺序的对象。如果你需要一个保留订单并返回一个数组(而不是一个对象)的替代方案,我已经创建了一个你可以使用的要点https://gist.github.com/superelement/69677823acf20d45fdbb11a051486936

此问题类似于此主题lodash sortBy then groupBy, is order maintained?

答案 3 :(得分:0)

来自_.groupBy的{​​{1}}的问题是,当我们执行集合的Underscore.js属性时,它会自动应用numeric排序,而对于ascending属性确实保留了收集顺序。

因此,如果有人在数字属性上使用string,那么如果要对集合应用特定的排序顺序,则需要对分组的集合再次应用排序。