JS forEach实现数组匹配转对象报toUpperCase类型错误问题
你的forEach版本代码跑不通的原因(面向JS新手)
你写的代码一共踩了3个非常典型的新手坑,逐个拆解如下:
1. 直接触发报错的核心原因:传给回调函数的参数类型错了
你的回调uppercaser接收字符串类型参数,要调用字符串自带的toUpperCase()方法。但你在forEach循环里写的是callback(newArr1),这个newArr1是什么?
你前面写了newArr1 = newArr1.split(",")——split执行完返回的是数组,你把一整个数组传给了要求传入字符串的回调,数组根本没有toUpperCase方法,当然会抛TypeError: str.toUpperCase is not a function的错。
2. 对forEach回调的参数理解完全偏差
你写的能正常运行的for循环里,变量i是从0开始递增的数组索引(数字类型),用来标记当前遍历到的元素位置。
但你写的arr1.forEach(el=>{ ... })里,这个el根本不是索引!它是当前遍历到的数组元素本身:
- 第一次循环el是字符串
'hi',不是数字0 - 第二次循环el是字符串
'howdy',不是数字1
你后面写arr2[el]等于在写arr2['hi'],永远拿不到第二个数组对应位置的元素,逻辑从根上就错了。
3. 开头的newArr1处理完全是画蛇添足
需求明确要求「逐个处理第一个数组的每一个元素」,你上来就把整个arr1转成一整个长字符串,转完大写再拆回数组,这一步完全没必要,还平白把数据类型搞乱,给后面埋了雷。
对照你写对的for循环,正确的forEach写法非常简单
forEach的回调函数支持接收第二个参数,这个参数才是和for循环里i作用完全一致的当前索引,直接用就行:
function objOfMatches(arr1, arr2, callback){ let obj = {}; // 第一个参数el是当前元素,第二个参数index是当前索引 arr1.forEach((el, index) => { // 把当前元素传给回调,和arr2同索引位置的值比对 if(callback(el) === arr2[index]){ obj[el] = arr2[index]; } }); return obj; }
跑你给的测试用例,会输出符合预期的{ hi: 'HI', bye: 'BYE', hello: 'HELLO' }。
内容的提问来源于stack exchange,提问作者iGRiK
相关产品推荐
相关产品推荐

