【问题标题】:Converting a for loop to forEach not working将 for 循环转换为 forEach 不起作用
【发布时间】:2018-08-31 19:08:27
【问题描述】:

我有一个具有一些属性的对象:

const carOptions = {
  mazda: 25000,  
  tesla: 85000,
  bmw: 100000
}

我想转换一个for 循环……

for (let i = 0; i < cars.length; i++) {
  if (cars[i].checked) {
    return carOptions[cars[i].id]
  }
}
…

…致.forEach,但此代码不起作用:

cars.forEach(function(cars)) {
  if (cars.checked) {
    return carOptions[cars.id]
  }
}
…

我错过了什么?

【问题讨论】:

标签: javascript ecmascript-6 ecmascript-2017


【解决方案1】:

问题是你是从回调函数返回的,而不是包含函数。

您应该在forEach() 回调中设置一个变量,然后在循环外返回。

var checkedOption;
cars.forEach(car => {
    if (car.checked) {
        checkedOption = carOptions[car.id];
    }
});
return checkedOption;

请注意,这不如for 循环有效。一旦找到匹配项,循环就会停止并从函数返回。但是没有办法在中间阻止forEach(),它将继续测试剩余的汽车。并且如果有多个被检查的汽车,checkedOption 将被设置为最后一个对应的选项,而不是第一个。

你可以改用.find():

var checkedCar = cars.find(car => car.checked);
if (checkedCar) {
    return carOptions[checkedCar.id];
}

【讨论】:

  • 您是建议我坚持使用for 循环还是使用.find()
  • 如果您想要函数式方法,请使用.find()
  • 这只是风格问题。有些人喜欢函数,有些人喜欢语句。
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多