Javascript lodash sortBy那么groupBy,秩序是否得以维持?

Javascript lodash sortBy那么groupBy,秩序是否得以维持?,javascript,arrays,sorting,lodash,Javascript,Arrays,Sorting,Lodash,我很难从lodash文档中判断我关于排序和分组的假设是否正确 如果我使用sortBy,然后使用groupBy,groupBy生成的数组是否保持项目的排序顺序 例如,假设我有以下数组: var testArray = [[5,6],[1,3],[5,4],[5,1]] 我想按照它们的第一个元素对它们进行分组,但也要按照它们在这些组中的第二个元素对它们进行排序。因此,在lodash中,我假设我可以做到以下几点: _.chain(testArray) .sortBy(function (item

我很难从lodash文档中判断我关于排序和分组的假设是否正确

如果我使用sortBy,然后使用groupBy,groupBy生成的数组是否保持项目的排序顺序

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

var testArray = [[5,6],[1,3],[5,4],[5,1]]
我想按照它们的第一个元素对它们进行分组,但也要按照它们在这些组中的第二个元素对它们进行排序。因此,在lodash中,我假设我可以做到以下几点:

_.chain(testArray)
  .sortBy(function (item) { return item[1]; })
  .groupBy(function (item) { return item[0]; })
  .value()
最终产生了我所期望的结果:

{
  1: [[1,3]]
  5: [[5,1],[5,4],[5,6]]
}
这只是巧合吗?sortBy和groupBy的工作方式是否确保了分组数组的这种顺序?文档中说sortBy是一种稳定的排序,这同样适用于groupBy吗?我有什么理由不认为每次都可以这样做吗?

的原因是
是:

// 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的“官方”特征,但它确实保留了类似数组的集合的顺序,这可能不会改变。

函数groupBy返回对象。对象不保存属性顺序。


但是组数组保存了顺序,因为它们添加了推送功能。

不是。以下是不保留订单的示例:

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排序的

不过,您可以使用原始数组对它们重新排序

const groupedItems = _(data)
  .groupBy(item => item.group)
  .sortBy(group => data.indexOf(group[0]))
  .value()

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

我的问题是关于结果数组的顺序,而不是由
groupBy
生成的父对象。请更新一点我的答案。只是我在对象属性顺序方面遇到了问题,所以我决定写这个。因此组中的子项将保留其原始顺序,但是分组键顺序可能会更改,因为它们是对象属性。这是纯金的:
.sortBy(group=>data.indexOf(group[0])
。帮我省了一个小时让这该死的东西运转起来!可能对库进行了更改,但您的第一个示例输出将按预期的组顺序显示。我使用的是lodash v4.17.15,我不认为这就是问题所在。当然,组没有排序,因为对象属性没有排序(groupBy
groupBy
给出的是一个对象,而不是一个数组!)。问题在于各组内部的顺序,而不是各组的顺序。