请求协助:按userId分组重构JSON数据
按userId分组JSON数组的实现方案
给定包含用户对象的JSON数组,要将其按userId字段分组,把相同userId的对象归到同一数组下,最终生成以userId为键、对应对象数组为值的对象,以下是几种实用实现方法:
方法一:使用Array.reduce()(推荐)
reduce是处理数组分组最简洁的方式之一,通过累加器逐步构建目标对象:
const originalData = [ { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }, { "userId": 2, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" }, { "userId": 3, "id": 3, "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut", "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut" } ]; const groupedData = originalData.reduce((acc, current) => { const userId = current.userId; // 若当前userId未在累加器中,初始化空数组 if (!acc[userId]) { acc[userId] = []; } // 将当前对象推入对应数组 acc[userId].push(current); return acc; }, {}); console.log(groupedData);
方法二:使用Array.forEach()
逻辑与reduce一致,通过遍历数组手动构建分组对象,更直观易懂:
const groupedData = {}; originalData.forEach(item => { const userId = item.userId; if (!groupedData[userId]) { groupedData[userId] = []; } groupedData[userId].push(item); }); console.log(groupedData);
方法三:使用Map结构(适合保留键类型)
如果需要保留userId的数字类型(普通对象的键会自动转为字符串),可以先用Map存储,再转成对象:
const map = new Map(); originalData.forEach(item => { const userId = item.userId; if (!map.has(userId)) { map.set(userId, []); } map.get(userId).push(item); }); // 将Map转换为普通对象 const groupedData = Object.fromEntries(map); console.log(groupedData);
以上三种方法都能生成你需要的分组结构,执行后每个userId对应的数组会包含所有该用户的对象。
内容的提问来源于stack exchange,提问作者The IT gal
相关产品推荐
相关产品推荐

