使用Array.reduce将数组转为对象报错,求问题排查与解决方法
问题分析与修复方案
嘿,我来帮你揪出代码里的问题!你的思路是对的——用reduce来把数组转成键值对相同的对象,但问题出在**reduce的回调函数没有返回累加器acc**。
为什么会报错?
reduce的工作逻辑是:每次迭代都会把回调函数的返回值作为下一次迭代的累加器。你的代码里,回调函数只做了acc[curr] = arr[i]这一步,没有返回acc,所以第一次迭代后,累加器就变成了undefined。到第二次迭代时,你尝试给undefined[curr]赋值,自然就会抛出错误啦。
另外还有个小冗余:curr本身就是当前迭代的数组元素,和arr[i]是同一个值,所以没必要写arr[i],直接用curr就行~
修复后的代码
const arrToObj = (arr) => { return arr.reduce((acc, curr) => { acc[curr] = curr; return acc; // 关键:返回更新后的累加器 }, {}); }; console.log(arrToObj([1,2,3,4,5,6,7,8,9])); // 输出:{1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}
或者用更简洁的箭头函数隐式返回写法:
const arrToObj = (arr) => arr.reduce((acc, curr) => ({ ...acc, [curr]: curr }), {});
这种写法利用对象展开语法,每次返回一个新的对象,同样能达到效果,不过如果数组很大的话,第一种写法的性能会更好一些,因为它是在同一个累加器对象上直接更新的。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

