【问题标题】:forEach and map in JavaScript [duplicate]JavaScript中的forEach和map [重复]
【发布时间】:2021-09-30 22:17:30
【问题描述】:

我刚刚尝试解决有关代码战的任务。
问题是编写一个函数,将字符串中大于或等于 5 的每个单词反转。

当我尝试使用 forEach 时,在我使用 map 之前它不会更改元素。

根据MDN页面,

forEach() 不会改变调用它的数组。 (不过,callbackFn 可能会这样做)

所以我期待数组发生变异,因为我向它传递了一个回调函数。

function spinWords(string){
 let a = string.split(" ");
//   console.log(a);
  a.forEach(el => {
    if (el.length >= 5) {
      let reverseSting = el.split("").reverse().join("");
      console.log(reverseSting);
      return reverseSting;
    }
    else {
//       
      return el;
    }
  })
  console.log(a);
  return a.join(" ");
}

function spinWords(string){
 let a = string.split(" ");
//   console.log(a);
  a = a.map(el => {
    if (el.length >= 5) {
      let reverseSting = el.split("").reverse().join("");
      console.log(reverseSting);
      return reverseSting;
    }
    else {
//       
      return el;
    }
  })
  console.log(a);
  return a.join(" ");
}

【问题讨论】:

  • "所以我期待数组发生变异,因为我向它传递了一个回调函数。"你为什么会这样?回调函数不会导致任何突变。 a return in a forEach do anything at all 也与数组无关。
  • 当建议回调可以改变数组时,这意味着回调会显式地为数组条目分配一个新值。在forEach 回调中返回值没有任何意义。
  • @VLAZ 所以我不能用 forEach 改变数组
  • @lawalolawale 没有一个不会导致任何突变的回调函数,没有。
  • @VLAZ 但我可以在 map 中使用 return 来修改元素并将其存储在新数组中,对吗?

标签: javascript arrays


【解决方案1】:

mapforEach 这两个函数都不会改变原始数组。这里的区别在于map 返回一个新数组,而forEach 不返回。这就是为什么你有

a = a.map(el => {

您将map 返回的数组分配回变量a。使用forEach,回调中的返回值没有被使用,也没有新的数组可以使用。

const array = [1, 2, 3, 4, 5]
const square = number => number * number
// logs [1, 4, 9, 16, 25]
console.log(array.map(square))
// logs undefined
console.log(array.forEach(square))

【讨论】:

  • 要进一步证明 JaKub 的观点,请看这里:i.stack.imgur.com/L8cSC.png 更多信息,请看forEach documentation
  • 我不想使用永不这个词,因为arrayOfObjects.forEach(obj => { delete obj.prop }) 有点打破了“永不”的想法,所以回调可以在某种程度上发生变化。
  • @JakubMichálek 非常感谢。我真的很感激
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
相关资源
最近更新 更多