【问题标题】:Maintaining sort order using underscore's groupBy()使用下划线的 groupBy() 维护排序顺序
【发布时间】:2014-12-04 17:39:14
【问题描述】:

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

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

我想使用 underscore 的 groupBy 函数对这些项目进行分组,同时保持被分组的属性的顺序。

调用_.groupBy(objects, 'group')时,结果如下:

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

在“05”之前将“23”分组放置在结果对象中是否有特殊原因?它似乎不尊重自然排序或分组数组的顺序。

【问题讨论】:

  • 对象没有顺序。

标签: javascript underscore.js


【解决方案1】:

您可以将_.groupBy 的结果视为哈希表,因为 JS 中的对象通常实现为无序哈希表,用于对属性值等进行恒定时间检索。

Javascript hashtable 实现不应该保证键的排序顺序,所以在使用它们时不能指望排序。

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

【讨论】:

  • 一些键/值数据结构是哈希表并且是有序的(例如 Ruby 的Hash),大多数没有有序。 JavaScript 规范没有说明Objects 是如何实现的,也没有说Objects 是有序的(参考over here)。 _.groupBy 返回一个Object 所以_.groupBy 的返回值不能保证是有序的。
  • 是的,你说得对..有一些例外,例如Wikipedia 将 Hashtables 归类为“无序关联数组”类型,但我同意最好验证具体实现。 Ruby Hash 实现保留了插入顺序,这是一个例外,而不是跨不同编程语言的通用哈希表的规则。我会更正我的答案以更准确。谢谢!
【解决方案2】:

您忽略了要点:JavaScript 对象不是有序数据集

但是,每个组内的特定项目将保留其顺序。只是组会被弄乱,因为如前所述,它们是对象的键,不能排序。

【讨论】:

    【解决方案3】:

    它返回一个对象,该对象失去了原来的顺序。如果您需要保持顺序并返回数组(而不是对象)的替代方法,我创建了一个您可以使用的要点 https://gist.github.com/superelement/69677823acf20d45fdbb11a051486936

    这个问题和这个帖子lodash sortBy then groupBy, is order maintained?类似

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 2015-10-24
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 2021-05-19
        相关资源
        最近更新 更多