JavaScript Reduce函数测试示例开发问题:从输入行生成单个对象
嘿,看起来你想要做一个测试JavaScript reduce函数的示例,目标是把随机生成的用户使用记录汇总成一个统计对象对吧?我帮你把代码捋顺并完善一下,让它能正常运行并达到你的需求:
完善后的测试程序
首先先修复你提供的generateInputs函数里的几个小问题:
Math.random(600)是错误用法,Math.random()本身返回0到1之间的随机数,要生成0-599的整数应该用Math.floor(Math.random() * 600)- 循环变量
i没有声明,会污染全局作用域,要加上let - 可以调整数组结构,让返回的数组直接是所有用户记录(如果需要保留行数,我也会给出兼容方案)
修正后的输入生成函数
function generateInputs() { const inputLines = Math.floor(Math.random() * 100); const arr = []; const userIDs = ["a","b","c","d","e"]; // 可选:如果需要把行数放在数组首位,就保留这行;否则可以删除 // arr.push(inputLines); for(let i = 0; i < inputLines; i++){ const userID = userIDs[Math.floor(Math.random() * userIDs.length)]; const usage = Math.floor(Math.random() * 600); arr.push(`${userID} ${usage}`); } return arr; }
使用reduce实现统计逻辑
接下来就是核心的reduce处理部分,把每行记录转换成一个统计每个用户总使用量的对象:
// 生成随机测试数据 const inputRecords = generateInputs(); // 用reduce汇总数据 const usageStats = inputRecords.reduce((acc, line) => { // 拆分每行的用户ID和使用量 const [userID, usageStr] = line.split(" "); const usage = parseInt(usageStr, 10); // 如果用户不在累加器中,先初始化为0 if (!acc[userID]) { acc[userID] = 0; } // 累加当前用户的使用量 acc[userID] += usage; return acc; }, {}); // 初始值设为空对象,用来存储统计结果 // 输出测试结果 console.log("原始记录:", inputRecords); console.log("统计结果:", usageStats);
特殊场景兼容(保留行数在数组首位)
如果你的原始需求必须把行数放在数组第一个元素,处理时只需要跳过第一个元素即可:
const inputArr = generateInputs(); // 此时数组第一个元素是行数 const usageStats = inputArr.slice(1).reduce((acc, line) => { // 逻辑和上面完全一致 }, {});
运行后你会得到类似这样的统计结果:
统计结果: { a: 1452, b: 987, c: 632, d: 2109, e: 741 }
内容的提问来源于stack exchange,提问作者Leviathan_the_Great
相关产品推荐
相关产品推荐

