使用groupBy时如何忽略冗余值?JSON数组多层分组问询
如何在Lodash多层groupBy中忽略冗余值?
我来帮你搞定这个多层分组后的冗余值问题~你说的冗余值应该就是那些已经作为分组键存在的字段(比如Day和Event),在分组后的每个子对象里还重复出现,完全没必要保留对吧?
你的现有代码已经在做两层嵌套分组(先按Day,再按Event),只需要在最后一层分组后,对每个子对象做一次「字段精简」就能去掉这些冗余值。用Lodash的_.omit或者_.pick就能轻松实现:
完整实现代码
var result = _(json) // 第一层:按Day分组 .groupBy('Day') .mapValues(dayGroup => _(dayGroup) // 第二层:按Event分组 .groupBy('Event') .mapValues(eventGroup => // 关键步骤:剔除每个对象里的Day和Event字段(因为已经是分组键了) _.map(eventGroup, item => _.omit(item, ['Day', 'Event'])) ) .value() ) .value();
为什么这么做?
外层的分组键已经明确告诉我们当前组的Day和Event值了,比如result['Preliminary/Final Qualifying Day 1']['Preliminary Qualifying']下面的所有对象,必然都属于这个Day和Event,所以每个对象里再保留这两个字段就是纯粹的冗余,用_.omit直接移除即可。
如果你更倾向于「明确保留需要的字段」(避免后续新增字段被误删),也可以用_.pick指定要保留的字段,这样更稳妥:
_.map(eventGroup, item => _.pick(item, [ 'BlockId', 'FirstName', 'LastName', 'PlayerPosition', 'TimeSlot' ]))
额外优化:顺便做数据转换
如果需要,你还可以在这个环节顺便处理数据格式,比如把PlayerPosition转成数字,或者格式化TimeSlot:
_.map(eventGroup, item => ({ ..._.omit(item, ['Day', 'Event']), PlayerPosition: parseInt(item.PlayerPosition, 10), TimeSlot: new Date(item.TimeSlot).toLocaleString() }))
这样处理后,你的分组结果会非常干净,没有多余的重复字段,同时还能保证数据的可用性。
内容的提问来源于stack exchange,提问作者Alexander Rivera
相关产品推荐
相关产品推荐

