【问题标题】:lodash - sort result of _.groupBy before creating an array with itlodash - _.groupBy 在用它创建数组之前对结果进行排序
【发布时间】:2018-08-08 21:37:12
【问题描述】:

我正在使用 lodash 的 groupBy 将对象按一个可以是 1 - 10 的数值分组。我们将属性称为“排序”

groupBy 的结果是这样的

{
    1:[{sort:1,...}, ...],
    2:[{sort:2,...}], ...].
    ...
}

接下来我使用 Object.values(result) 将其转换回二维数组,以便使用双 ngFor 以角度显示它。

问题是我不能确定(我可以吗?)对象的顺序是否井井有条。 groupBy 是否按优先顺序创建键?

所以如果结果看起来像

{
    3:[...],
    1:[...],
    2:[...],
    ...
}

在将 _groupBy 结果推送到数组之前如何对其进行预排序?

【问题讨论】:

    标签: angular sorting underscore.js lodash


    【解决方案1】:

    我也很难相信 JavaScript 对象的迭代顺序。我建议你使用 lodash 的 sortBy 函数来消除不确定性。

    如果我正确解释了您的问题,则将sortBy 应用于您的result 对象(使用_.property iteratee shorthand)应该会为您提供您正在寻找的二维数组结构:

    this.target_data = _.sortyBy(result, 'sort');
    

    this.target_data变成二维数组:第一行是sort = 1的对象列表,接下来是sort = 2的对象列表,以此类推

    请看this快速演示。

    【讨论】:

      【解决方案2】:

      _.groupBy 方法的文档中对此进行了非常明确的定义:

      创建一个由通过迭代器运行集合的每个元素的结果生成的键组成的对象。 分组值的顺序由它们在集合中出现的顺序决定。每个键对应的值是负责生成键的元素数组。使用一个参数调用迭代对象:(值)。

      如果你想订购这些,你需要在_.groupBy之前_.orderBy / _.sortBy

      【讨论】:

        【解决方案3】:

        由于您的键是数字,Object.values() 将创建一个数组,其中的值按原始键的数值排序。

        const data = {
            3:3,
            1:1,
            2:2,
        };
        
        const result = Object.values(data);
        
        console.log(result);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-25
          • 2013-08-20
          • 1970-01-01
          • 2017-09-08
          • 2022-07-22
          • 2015-05-10
          • 1970-01-01
          相关资源
          最近更新 更多