如何在JavaScript中按用户分组对象?
按用户ID分组数据的实用解决方案
嘿,这个需求太常见了!我给你用JavaScript写个高效的实现方案,几步就能把原始数据按ID分组搞定:
1. 先理清楚思路
我们可以用数组的reduce方法遍历原始数据,把每个数据项以ID为键,收集到对应的数组中,最终得到一个以用户ID为键、对应数据列表为值的对象。
2. 完整代码示例
模拟原始数据库数据
先补全你给出的原始数据格式(方便演示):
const rawData = [ { ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35', value: 13.450980186462402, created: '2018-05-02T13:21:19.960Z' }, { ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9', value: 13.450980186462402, created: '2018-05-02T13:21:24.179Z' }, { ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35', value: 15.2345, created: '2018-05-03T09:15:00.000Z' }, { ID: '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b', value: 9.876, created: '2018-05-02T14:30:45.500Z' } ];
核心分组代码
就几行,逻辑清晰易懂:
const groupedByUser = rawData.reduce((acc, currentItem) => { // 如果当前ID还没在累加器里,先初始化一个空数组 if (!acc[currentItem.ID]) { acc[currentItem.ID] = []; } // 把当前数据项的value和created添加到对应ID的数组中 acc[currentItem.ID].push({ value: currentItem.value, created: currentItem.created }); return acc; }, {}); // 初始值是空对象
分组后的结果
运行后groupedByUser的结构会是这样的:
{ "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35": [ { "value": 13.450980186462402, "created": "2018-05-02T13:21:19.960Z" }, { "value": 15.2345, "created": "2018-05-03T09:15:00.000Z" } ], "5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9": [ { "value": 13.450980186462402, "created": "2018-05-02T13:21:24.179Z" } ], "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b": [ { "value": 9.876, "created": "2018-05-02T14:30:45.500Z" } ] }
3. 额外优化(可选)
如果需要把结果转换成数组形式(比如每个元素是{ userId: 'xxx', records: [...] }),可以用Object.entries再处理一遍:
const groupedArray = Object.entries(groupedByUser).map(([userId, records]) => ({ userId, records }));
这个方案只需要遍历一次原始数组,不管数据量多大都能高效处理,完全满足你的需求~
内容的提问来源于stack exchange,提问作者Giovanni Palusa
相关产品推荐
相关产品推荐

