使用嵌套forEach重构对象触发TypeError,求修复及替代方案
修复你的代码并优化实现
首先来说你遇到的TypeError的核心原因:外层forEach遍历的每个元素是单个键值对的对象(比如{teacher: [...]}),而对象本身没有forEach方法,直接调用i.forEach自然会报错。另外你的赋值逻辑也有语法和结构上的问题,比如错误地把file对象当作键,以及没有先初始化teacher/student对应的空对象。
修复后的嵌套forEach版本
我们可以先通过Object.entries把每个用户对象拆成键(角色:teacher/student)和对应的文件数组,再进行遍历:
const users = [ {teacher: [ {file: 'chemistry', size: '2MB'}, {file: 'math', size: '1MB'}] }, {student: [ {file: 'chemistry', size: '3MB'}, {file: 'math', size: '4MB'}] } ]; let final = {}; users.forEach(userObj => { // 取出每个对象里的键(teacher/student)和对应的文件数组 const [role, files] = Object.entries(userObj)[0]; // 先初始化该角色对应的空对象 final[role] = {}; files.forEach(file => { const filesizestring = `newfilesize${file.size}`; // 给对应角色的对象添加文件键和处理后的字符串 final[role][file.file] = filesizestring; }); }); console.log(final); // 输出:{teacher: { chemistry: 'newfilesize2MB', math: 'newfilesize1MB' }, student: { chemistry: 'newfilesize3MB', math: 'newfilesize4MB' }}
更优雅的替代方案:使用reduce
如果不想用嵌套forEach,可以用数组的reduce方法,代码更简洁且函数式:
const users = [ {teacher: [ {file: 'chemistry', size: '2MB'}, {file: 'math', size: '1MB'}] }, {student: [ {file: 'chemistry', size: '3MB'}, {file: 'math', size: '4MB'}] } ]; const final = users.reduce((acc, userObj) => { const [role, files] = Object.entries(userObj)[0]; acc[role] = files.reduce((fileAcc, file) => { fileAcc[file.file] = `newfilesize${file.size}`; return fileAcc; }, {}); return acc; }, {}); console.log(final); // 同样得到期望的结果
这个方案通过两次reduce,外层构建最终的角色对象,内层构建每个角色对应的文件映射,避免了手动声明变量和嵌套循环的副作用,代码可读性也更高。
内容的提问来源于stack exchange,提问作者moaningalways
相关产品推荐
相关产品推荐

