javascript – lodash sortBy然后groupBy,是否维护订单?

前端之家收集整理的这篇文章主要介绍了javascript – lodash sortBy然后groupBy,是否维护订单?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我对排序和分组的假设是正确的,我很难从lodash文档中搞清楚.

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

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

var testArray = [[5,6],[1,3],[5,4],1]]

我想通过它们的第一个元素对它们进行分组,但也要按照这些组中的第二个元素对它们进行排序.所以,在lodash我假设我可以做以下事情:

_.chain(testArray)
  .sortBy(function (item) { return item[1]; })
  .groupBy(function (item) { return item[0]; })
  .value()

最终会产生我期望的结果:

{
  1: [[1,3]]
  5: [[5,1],6]]
}

这只是巧合吗?有什么关于sortBy和groupBy如何工作以确保分组数组的这种排序?文档说sortBy是一个稳定的排序,以同样的方式应用于groupBy吗?有什么理由我不应该认为每次都会这样吗?

解决方法

_.groupBy的 current implementation是:
// 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,key) {
  if (_.has(result,key)) result[key].push(value); else result[key] = [value];
});

基本上它按顺序迭代集合中的每个项目(如果集合是类似数组的,它将在sortBy之后),并根据它们的键值将它们推送到数组.

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

猜你在找的JavaScript相关文章