首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lodash sortBy然后是groupBy,是否保持了顺序?

lodash sortBy然后是groupBy,是否保持了顺序?
EN

Stack Overflow用户
提问于 2015-03-05 01:06:36
回答 3查看 22.3K关注 0票数 13

如果我对排序和分组的假设是正确的,我很难从lodash文档中找出答案。

如果我使用sortBy,那么使用groupBy,groupBy生成的数组是否保持项的排序顺序?

例如,假设我有以下数组:

代码语言:javascript
复制
var testArray = [[5,6],[1,3],[5,4],[5,1]]

我想按它们的第一个元素对它们进行分组,但也要按它们在这些组中的第二个元素进行排序。因此,在lodash中,我假设我可以执行以下操作:

代码语言:javascript
复制
_.chain(testArray)
  .sortBy(function (item) { return item[1]; })
  .groupBy(function (item) { return item[0]; })
  .value()

这最终产生了我期望的结果:

代码语言:javascript
复制
{
  1: [[1,3]]
  5: [[5,1],[5,4],[5,6]]
}

这仅仅是巧合吗?关于sortBy和groupBy是如何工作的,有没有什么方法可以确保分组数组的这种排序?文档上说sortBy是一个稳定的排序,这同样适用于groupBy吗?有什么理由我不应该假设每次都会起作用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-05 01:20:01

_.groupBycurrent implementation为:

代码语言:javascript
复制
// An internal function used for aggregate "group by" operations.
var group = function(behavior) {
  return function(obj, iteratee, context) {
    var result = {};
    iteratee = cb(iteratee, context);
    _.each(obj, function(value, index) {
      var key = iteratee(value, index, obj);
      behavior(result, value, key);
    });
    return result;
  };
};

// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
_.groupBy = group(function(result, value, key) {
  if (_.has(result, key)) result[key].push(value); else result[key] = [value];
});

基本上,它按顺序遍历集合中的每个项(如果集合是类似数组的,则在sortBy之后),并根据它们的键值将它们推入数组。

所以,是的,我不确定这是否是_.groupBy的“官方”特征,但它确实保留了类似数组的集合的顺序,而且这可能不太可能改变。

票数 12
EN

Stack Overflow用户

发布于 2016-12-09 20:54:08

事实并非如此。下面是不保留顺序的示例:

代码语言:javascript
复制
const data = [
  {
    item: 'item1',
    group: 'g2'
  },   {
    item: 'item2',
    group: 'g3'
  },   {
    item: 'item3',
    group: 'g1'
  },   {
    item: 'item4',
    group: 'g2'
  },   {
    item: 'item5',
    group: 'g3'
  }
]

const groupedItems = _(data).groupBy(item => item.group).value()

在这种情况下,人们会认为组的顺序是: g2,g3,g1 -实际上它们是按g1,g2,g3排序的。

您可以使用原始数组对它们进行重新排序。

代码语言:javascript
复制
const groupedItems = _(data)
  .groupBy(item => item.group)
  .sortBy(group => data.indexOf(group[0]))
  .value()

这将确保项目的原始顺序。

票数 18
EN

Stack Overflow用户

发布于 2016-03-10 04:21:11

函数groupBy返回object。对象不保存属性顺序。Does JavaScript Guarantee Object Property Order?

但group数组保留了顺序,因为它们都添加了推送功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28860526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档