如何使用Lodash将分组后的数组转换为堆结构?
问题描述
我尝试用 Lodash 对对象数组进行分组操作,之后想把每个分组从数组转换成堆结构存储。
我的对象类型定义如下:
// 伪代码 type Pool = { address: string price: number } const poolGroups = _.groupBy(pools, x => `${x.address}`);
现在我希望每个分组都存储为堆而非数组,我原本想这么写:
_.groupBy(poolGroup.map(g => { return {g.Key, new Heap(g.values, minComparator) }), g.Key);
但这段代码无法编译(我主力语言不是 TypeScript)。请问该如何修改,让 Lodash 分组后的存储值变成堆结构?
解决方案
你不需要再嵌套调用 _.groupBy,正确的做法是先完成分组,再用 _.mapValues 遍历分组后的对象,把每个分组的数组替换成堆实例:
// 假设你已经有 Heap 类和 minComparator 比较器的定义 const poolGroupsWithHeap = _.mapValues(poolGroups, (poolArray) => { return new Heap(poolArray, minComparator); });
代码说明
- 先用
_.groupBy完成基础分组,得到以address为键、Pool 数组为值的对象poolGroups。 - 用
_.mapValues遍历这个对象的所有值(也就是每个分组的数组),将每个数组传入 Heap 构造函数,生成对应的堆实例替换原数组。 - 最终
poolGroupsWithHeap的结构就是:{ [address: string]: Heap<Pool> },完全符合你的需求。
为什么原来的写法不行?
你之前的代码逻辑混淆了分组和值转换的步骤:_.groupBy 是用来根据键对数组元素分组的,不是用来转换已分组后的值的。而且代码里的语法错误也很多(比如对象字面量写法错误、参数传递错误),用 _.mapValues 才是处理“转换对象所有值”场景的正确工具。
内容的提问来源于stack exchange,提问作者Ritzy Dev
相关产品推荐
相关产品推荐

