首页 > 解决方案 > 带有扩展运算符的 forEach 返回未定义

问题描述

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

[{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
}

我明白了result = undefined。为什么?

标签: javascript

解决方案


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

function removeSpecialCharacters(metadata) {
  const result = metadata.map(datum => {
    const cleanId = datum.id.replace(/[.|&;$%@%"<>+]/g, '')
    return { ...datum, id: cleanId }
  })
  return result
}

const data = [{id: "somethin%g", apple: "dfgdf efd"}];
console.log(removeSpecialCharacters(data));

这是执行此操作的更短方法:

function removeSpecialCharacters(metadata) {
  return metadata.map(datum =>
    ({ ...datum, id: datum.id.replace(/[.|&;$%@%"<>+]/g, '') })
  )
}

const data = [{id: "somethin%g", apple: "dfgdf efd"}];
console.log(removeSpecialCharacters(data));

请参阅地图上的文档和MDN 上的forEach


推荐阅读