kan*_*and 9 javascript arrays sorting lodash
如果我对排序和分组的假设是正确的,我很难从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吗?有什么理由我不应该认为每次都会这样吗?
Hat*_*tch 12
不是.以下是不保留订单的示例:
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()
这将确保物品的原始订单.
JLR*_*she 10
在当前实现的_.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];
});
基本上它按顺序遍历集合中的每个项目(如果集合是数组的,它将在a之后sortBy),并根据它们的键值将它们推送到数组.
所以,是的,我不确定这是否是"官方"的特征_.groupBy,但它确实保留了类似阵列的集合的顺序,而且这可能不太可能改变.
| 归档时间: | 
 | 
| 查看次数: | 11860 次 | 
| 最近记录: |