Преобразование цикла for в forEach не работает - PullRequest
0 голосов
/ 31 августа 2018

У меня есть объект с некоторыми свойствами:

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]
  }
}
…

… To .forEach, но этот код не работает:

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

Чего мне не хватает?

1 Ответ

0 голосов
/ 31 августа 2018

Проблема в том, что вы возвращаетесь из функции обратного вызова, а не из содержащей ее функции.

Вы должны установить переменную в обратном вызове 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];
}
...