【问题标题】:lodash groupby uses string key instead of numberlodash groupby 使用字符串键而不是数字
【发布时间】:2017-11-23 00:32:05
【问题描述】:

当使用 lodash 中的 groupby 时,每个组的键都假定为字符串而不是其原始类型

示例:

let p1 = { age: 50 };
let p2 = { age: 130 };
let p3 = { age: 25 };
let groups = _.groupBy([p1, p2, p3], (p: any) => p.age);
let sortedKeys = _.keys(groups).sort();
for (let key of sortedKeys) {      
  console.log(key);
}

输出:

130 个字符串

25 个字符串

50 个字符串

我知道我可以通过修改 sort() 来解决这个问题

_.keys(groups).sort((k1:any, k2:any) => { return k1-k2; });

但不应该保留groupby 键的原始类型(在本例中为number)吗?

【问题讨论】:

  • 因为对象键是字符串
  • 您究竟希望发生什么?您是否正在尝试按排序组织对象键?对象键顺序无法保证,也永远不会。
  • 尝试按数字分组,然后按该分组排序。不希望分组进行排序,但我希望保留 groupby 的类型
  • 是的,正如您所提到的,lodash 的函数不会保留类型。如果你想编写自己的函数,你可以将整数作为键
  • 有人知道如何将密钥保存为 int 吗?我有同样的问题。不关心排序。但我的输出需要将键作为整数而不是字符串。

标签: javascript lodash


【解决方案1】:

我不知道为什么 lodash groupBy 不支持 numberSymbol 键。根据键选择器功能(甚至属性名称)定义通用KeyType 似乎是可行的。也许它只是在等待有人将更好的类型定义公关到@types/lodash

同时,我为我的项目写了这个(我只需要函数变体):

const groupByNumber = <T>(data: T[], keySelector: ((k: T) => number)): Record<number, T[]> => {
  const result: Record<number, T[]> = {}

  for (const datum of data) {
    const key = keySelector(datum)
    if (!(key in result)) {
      result[key] = [datum]
    } else {
      result[key].push(datum)
    }
  }

  return result
}

您将无法链接,但您可以嵌套:

const data = mapValues(groupByNumber(detections, d => d.hour), ds => ds.length)

我确信它可以改进,但总比没有好,希望它能引发更多的讨论和迭代:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 2014-07-26
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多