forEach结合扩展运算符返回undefined?对象数组id特殊字符处理疑问
为什么你的函数返回
undefined? 嗨,这个问题我太熟悉啦!你遇到的result为undefined的核心原因在于**Array.prototype.forEach()本身就不会返回任何值(默认返回undefined)**——它的作用只是遍历数组、执行你传入的回调函数,并不会把回调里的返回值收集起来生成新数组。
你的代码问题拆解
你在forEach的回调里虽然每次都返回了处理后的对象,但这些返回值完全不会被forEach处理或收集,它干完遍历的活就直接返回undefined了,所以result自然就是undefined。
正确的解决方案:用map替代forEach
如果要把原数组的每一项转换后生成新数组,Array.prototype.map()才是正确的选择——它会遍历数组,把每个回调的返回值组装成一个新数组返回。修改后的代码如下:
function removeSpecialCharacters(metadata) { const result = metadata.map(datum => { const cleanId = datum.id.replace(/[.|&;$%@%"<>+]/g, '') // 复制原对象属性并覆盖id,不修改原数据 return { ...datum, id: cleanId } }) console.log(result) return result }
用forEach的替代写法(不推荐,但可以了解)
如果一定要用forEach,你需要手动创建一个空数组,然后在回调里把处理后的对象push进去:
function removeSpecialCharacters(metadata) { const result = [] metadata.forEach(datum => { const cleanId = datum.id.replace(/[.|&;$%@%"<>+]/g, '') result.push({ ...datum, id: cleanId }) }) console.log(result) return result }
不过显然map更简洁、更贴合“数组映射转换”的场景,是这类需求的最优解。
内容的提问来源于stack exchange,提问作者user7558372
相关产品推荐
相关产品推荐

