使用Lodash对JS对象数组按双键分组的需求调整问题
解决方案
原代码的问题在于_.groupBy('b', 'c')并未同时按b和c分组——Lodash的groupBy仅接受一个分组参数,实际逻辑是仅按b字段分组,导致所有b='sample'的项被归为一组,不管c的值,这才出现了test4被错误合并的情况。
要实现仅当b='sample'且c='ten'时合并a值,其余情况按b和c的组合独立分组的需求,可以通过自定义分组键实现:
var _ = require('lodash') const objects = [ { a: 'test1', b: 'sample', c: 'ten' }, { a: 'test2', b: 'sample', c: 'ten' }, { a: 'test3', b: 'sampleone', c: 'ten' }, { a: 'test4', b: 'sample', c: 'tentwo' }, ] const grouped = _(objects) // 自定义分组规则:符合条件的项用统一键,其余用b+c的唯一组合键 .groupBy(item => { return item.b === 'sample' && item.c === 'ten' ? 'sample-ten' : `${item.b}-${item.c}` }) .map((items) => ({ b: items[0].b, c: items[0].c, a: items.map(item => item.a).join('|') })) .value() console.log(grouped)
逻辑说明
- 分组阶段:通过
groupBy的自定义函数,给需要合并的项(b='sample'且c='ten')分配同一个分组键sample-ten;其他项则用b和c拼接的字符串作为唯一键,确保不同b+c组合的项各自成组。 - 转换阶段:遍历每个分组,提取
b、c(取分组内第一个项的值即可,同一分组的b和c符合规则),并将分组内所有项的a值用|拼接。
执行后输出结果完全符合预期:
[ { b: 'sample', c: 'ten', a: 'test1|test2' }, { b: 'sampleone', c: 'ten', a: 'test3' }, { b: 'sample', c: 'tentwo', a: 'test4' } ]
内容的提问来源于stack exchange,提问作者Daryl Wong
相关产品推荐
相关产品推荐

