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
不支持 number
或 Symbol
键。根据键选择器功能(甚至属性名称)定义通用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。如何为分组输出添加自己的键?
SQL Server 2005 会因为我使用 nvarchar(50) 而不是整数作为主键而惩罚我吗?