lodash groupby 使用字符串键而不是数字

Posted

技术标签:

【中文标题】lodash groupby 使用字符串键而不是数字【英文标题】:lodash groupby uses string key instead of number 【发布时间】: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 吗?我有同样的问题。不关心排序。但我的输出需要将键作为整数而不是字符串。 【参考方案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)

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

【讨论】:

以上是关于lodash groupby 使用字符串键而不是数字的主要内容,如果未能解决你的问题,请参考以下文章

使用 lodash .groupBy。如何为分组输出添加自己的键?

应用程序本地化显示 iOS 中的键而不是值

SQL Server 2005 会因为我使用 nvarchar(50) 而不是整数作为主键而惩罚我吗?

如何忽略单元格输入中的制表键而不是制表符?数据网格视图 C#

使用 lodash 检查数组是不是存在于另一个数组中

使用软键盘上的“ENTER”键而不是单击按钮