如何使用Underscore.js按用户和日期分组数据并整理格式
使用Underscore.js按用户和日期分组数据解决方案
嘿,我来帮你搞定这个分组问题!先理清楚你的需求:你有一组包含用户、日期和时段的数据,需要用Underscore.js整理成用户名 - 日期 - 时段1 - 时段2 - 下一个日期 - 时段1 - 时段2这样的字符串格式。
原始数据
const rawData = [ { "Name": "User1", "SlotStartDate": "05/16/2018", "SlotStartTime": "9:20AM" }, { "Name": "User1", "SlotStartDate": "05/16/2018", "SlotStartTime": "10:20AM" }, { "Name": "User1", "SlotStartDate": "05/17/2018", "SlotStartTime": "9:20AM" }, { "Name": "User1", "SlotStartDate": "05/17/2018", "SlotStartTime": "10:20AM" }, { "Name": "User2", "SlotStartDate": "05/16/2018", "SlotStartTime": "8:45AM" }, { "Name": "User2", "SlotStartDate": "05/16/2018", "SlotStartTime": "9:25AM" }, { "Name": "User2", "SlotStartDate": "05/17/2018", "SlotStartTime": "8:45AM" }, { "Name": "User2", "SlotStartDate": "05/17/2018", "SlotStartTime": "9:25AM" } ];
期望输出格式
User1 - "05/16/2018" - "9:20AM" - "10:20AM" - "05/17/2018" - "9:20AM" - "10:20AM" User2 - "05/16/2018" - "8:45AM" - "9:25AM" - "05/17/2018" - "8:45AM" - "9:25AM"
你现有代码的问题
你之前的代码是把用户名+日期作为分组key,得到的是每个用户+日期组合的时段集合,但没有进一步按用户层级整理,也没有拼接成目标字符串格式。
可行解决方案
我们可以分两步分组,再拼接成目标格式:
// 1. 先按用户名分组,把同一用户的所有数据归到一起 const groupedByUser = _.groupBy(rawData, 'Name'); // 2. 处理每个用户的分组数据,生成目标格式的字符串 const formattedResult = _.map(groupedByUser, (userSlots, userName) => { // 对当前用户的所有时段,再按日期分组 const groupedByDate = _.groupBy(userSlots, 'SlotStartDate'); // 把日期和对应的时段展开成一维数组(比如["05/16/2018", "9:20AM", "10:20AM"...]) const dateTimeSequence = _.flatMap(groupedByDate, (slots, date) => { const times = _.pluck(slots, 'SlotStartTime'); return [date, ...times]; }); // 把数组元素加上引号,用" - "连接,再拼接用户名 return `${userName} - ${dateTimeSequence.map(item => `"${item}"`).join(' - ')}`; }); // 输出最终结果,每行一个用户 console.log(formattedResult.join('\n'));
代码说明
- 第一步分组:用
_.groupBy(rawData, 'Name')把数据分成User1和User2两个大组,每个组里是该用户的所有时段数据。 - 第二步分组:对每个用户组,再用
_.groupBy按日期分组,得到该用户下不同日期的时段集合。 - 展开与拼接:用
_.flatMap把每个日期和对应的时段展开成一维数组,然后给每个元素加上引号,用-连接,最后加上用户名就得到了目标格式的字符串。 - 输出结果:把所有用户的字符串用换行符连接,打印出来就是你想要的格式。
内容的提问来源于stack exchange,提问作者Andy P.
相关产品推荐
相关产品推荐

