Javascript 带有扩展运算符的forEach返回未定义

Javascript 带有扩展运算符的forEach返回未定义,javascript,Javascript,我有一个这种类型的对象数组: [{id: "somethin%g", apple: "dfgdf efd"}, ...] 我想替换key=id值中的一些特殊字符,而不更改对象的任何其他内容 因此,上面的例子必须是: [{id: "something", apple: "dfgdf efd"}, ...] 我尝试此功能: function removeSpecialCharacters(metadata) { const result = metadata.forEach(datum =&

我有一个这种类型的对象数组:

[{id: "somethin%g", apple: "dfgdf efd"}, ...]
我想替换key=
id
值中的一些特殊字符,而不更改对象的任何其他内容

因此,上面的例子必须是:

[{id: "something", apple: "dfgdf efd"}, ...]
我尝试此功能:

function removeSpecialCharacters(metadata) {
  const result = metadata.forEach(datum => {
    const cleanId = datum.id.replace(/[.|&;$%@%"<>+]/g, '')
    return { ...datum, id: cleanId }
  })
  console.log(result)
  return result
}
函数删除特殊字符(元数据){
const result=metadata.forEach(数据=>{
const cleanId=datum.id.replace(/[.|&;$%@%“+]/g,”)
返回{…datum,id:cleanId}
})
console.log(结果)
返回结果
}

我得到
result=undefined
。为什么?

你必须用
map
替换
forEach
forEach
不返回数组。它只是运行循环的内容并丢弃结果。而
map
将创建第二个数组并用映射的内容填充它

函数删除特殊字符(元数据){
const result=metadata.map(数据=>{
const cleanId=datum.id.replace(/[.|&;$%@%“+]/g,”)
返回{…datum,id:cleanId}
})
返回结果
}
const data=[{id:“somethin%g”,apple:“dfgdf efd”}];

日志(删除特殊字符(数据)),因为
forEach
的返回值是
undefined
()。改用

此外,如果您的
id
中只需要字母数字字符,您可以简单地使用以下正则表达式:
\W+

\W+
匹配所有非字母数字字符。用空字符串替换它们

函数删除特殊字符(元数据){
const result=metadata.map(数据=>{
const cleanId=datum.id.replace(/\W+/g',)
返回{…datum,id:cleanId}
})
返回结果
}
const data=[{id:%g#中的someth+,apple:“dfgdf efd”},
{id:'some%@%'+#',苹果:“dfgdf efd}];
console.log(删除特殊字符(数据));