You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:03:43