【问题标题】:How to nest multiple groupby with loadash/javascript如何使用 loadash/javascript 嵌套多个 groupby
【发布时间】:2019-05-19 02:12:46
【问题描述】:

提前感谢任何可以帮助我的人。我正在尝试使用 React Native 中的 SectionList 显示数据。我在下面写了我的代码,显示了我想要完成的事情。常规的 javascript 解决方案将起作用。我希望数据首先按日期分组,在该日期内,我需要按位置分组。

它有一个标题和数据键很重要 我有这种格式的数据:

[ { game_id: 1171,
    date: '2018-11-17',
    location: 'Plaza'
   },
  { game_id: 1189,
    date: '2018-11-17',
    location: 'Field - Kickball'
   },
   { game_id: 1489,
    date: '2018-11-16',
    location: 'Field - Kickball'
   },
   { game_id: 1488,
    date: '2018-11-16',
    location: 'Field - Soccer'
   }
]

我需要显示输出:

data = [{
    title: "2018-11-17",
    data: [{
            title: "Field - Kickball",
            data: [{
                game_id: 1189,
                date: '2018-11-17',
                location: 'Field - Kickball'
            }]
        },
        {
            title: "Plaza",
            data: [{
                game_id: 1171,
                date: '2018-11-17',
                location: 'Plaza'
            }]
        }
    ]
    },
    {
        title: "2018-11-16",
        data: [{
                title: "Field - Kickball",
                data: [{
                    game_id: 1489,
                    date: '2018-11-16',
                    location: 'Field - Kickball'
                }]
            },
            {
                title: "Field - Soccer",
                data: [{
                    game_id: 1488,
                    date: '2018-11-16',
                    location: 'Field - Soccer'
                }]
            }
        ]
    }
]

我已经试过了

const games = [data here]
var groups = _(games)
.groupBy(x => x.date)
        .map(value => {
            return _.groupBy(value, 'location')
            .map(({key, value}) => ({title: key, data: value}))
        })

        .map((value, key) => {
            return ({title: value[Object.keys(value)[0]][0].date, data: value})
        })

【问题讨论】:

  • 你也能写出预期的输出吗?
  • 期望值是以“我需要输出显示:”开头的代码

标签: javascript arrays object ecmascript-6 lodash


【解决方案1】:

像这样使用reduce

const data = [{game_id:1171,date:'2016-11-17T05:00:00.000Z',time:'08:00:00',category:'Ch B Coed',background:'#FFFF00',textcolor:'#000000',bold:0,sport:'Newcomb',location:'Plaza',text:'COL2 vs. USA1 1171'},{game_id:1189,date:'2016-11-17T05:00:00.000Z',time:'08:50:00',category:'Ch A Coed',background:'#FF33CC',textcolor:'#000000',bold:0,sport:'Kickball',location:'Field - Kickball',text:'COL1 vs. USA1 1189'},{game_id:1489,date:'2016-2-17T05:00:00.000Z',time:'04:50:00',category:'Ch B Coed',background:'#FF33CC',textcolor:'#000000',bold:0,sport:'Kickball',location:'Field - Kickball',text:'COL2 vs. USA3 1489'}];

const res = Object.values(data.reduce((acc, { date, ...rest }) => acc[date] ? { ...acc, [date]: { ...acc[date], data: acc[date].data.concat({ date, ...rest })} } : { ...acc, [date]: { title: date, data: [{ date, ...rest }] }}, {}));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

【讨论】:

  • 不用担心@EyalAbadi,如果我的回答解决了您的问题,请点击我的回答左侧的灰色勾号接受它。
  • 是的,它会收集date和所有其他属性到变量中,然后将它们排列到titledata中。
  • 对不起,我实际上搞砸了预期的输出。我的意思是在每一天里面,都会有另一个标题和数据,都被字段分隔。我真正需要的是[ {title:"2016-11-17T05:00:00.000Z",data: [ title:"Field - Kickball" data:{ game_id: 1489, date: '2016-2-17T05:00:00.000Z', time: '04:50:00', category: 'Ch B Coed', background: '#FF33CC', textcolor: '#000000', bold: 0, sport: 'Kickball', location: 'Field - Kickball', text: 'COL2 vs. USA3 1489' },...
【解决方案2】:

如果我遗漏了什么,请原谅我,但在我看来,这似乎可以通过Array.reduce 以更简单的方式完成:

let data = [{ game_id: 1171, date: '2016-11-17T05:00:00.000Z', time: '08:00:00', category: 'Ch B Coed', background: '#FFFF00', textcolor: '#000000', bold: 0, sport: 'Newcomb', location: 'Plaza', text: 'COL2 vs. USA1 1171' }, { game_id: 1189, date: '2016-11-17T05:00:00.000Z', time: '08:50:00', category: 'Ch A Coed', background: '#FF33CC', textcolor: '#000000', bold: 0, sport: 'Kickball', location: 'Field - Kickball', text: 'COL1 vs. USA1 1189' }, { game_id: 1489, date: '2016-2-17T05:00:00.000Z', time: '04:50:00', category: 'Ch B Coed', background: '#FF33CC', textcolor: '#000000', bold: 0, sport: 'Kickball', location: 'Field - Kickball', text: 'COL2 vs. USA3 1489' } ]

let result = data.reduce((r, c) => {
  r[c.date] = r[c.date] || {title: c.date, data: []}
  r[c.date].data = [...(r[c.date].data || []), c]
  return r
}, {})

console.log(Object.values(result))

【讨论】:

  • 您好,谢谢您的回答。我实际上搞砸了预期的输出。你能再帮我一次吗?
  • 你的输入到处都是输出。你能格式化并确保你输入的日期与你的输出分组相匹配吗?您的日期将按照您想要的方式进行分组。它们必须首先匹配,然后按位置等进行分组。
  • 我已经更新了预期的结果!提前致谢!我一直在努力寻找解决方案
  • 我在您的其他帖子中发布了答案。我想这样会更好,因为在这里你已经有了一个可以接受的答案等。
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多