Почему for и forEach работают по-разному? [дубликат]

294
07 сентября 2017, 20:04

На данный вопрос уже ответили:

  • Прервать цикл forEach (javascript) 4 ответа

Привет. С недавних пор решил перейти с for-цикла на forEach(), ибо это действительно удобнее. Особенно при работе с вложенными массивами. Обычно у меня всё работало нормально, то теперь вот произошла какая-то чертовщина. У меня есть функция, которая проходится по обычному массиву и сверяет, есть ли в элементе этого массива значение ключа, которое соответствовало бы отправленной к функции в качестве аргумента переменной:

function getDepCountryFlag(dep) {
    airports.forEach((airport) => {
        if(airport.id == dep) {
            return airport.country_code;
        }
    });
}

Казалось бы, просто как дважды два. Но вот это дело всё время выдавало мне undefined. Я уже было хотел подзабить и оставить это на завтра, но решил на крайняк уже попробовать старый добрый for-loop. И мой код чудесным образом перестал отдавать мне undefined и заработал так, как мне и нужно было!

function getDepCountryFlag(dep) {
    for(let i = 0; i < airports.length; i++) {
        if(airports[i].id == dep)
            return airports[i].country_code;
    }
}

Вопрос: я что-то упустил при чтении документации по forEach и он не работает по аналогии с for? Почему давал undefined, а for заработал?

Answer 1

В этом куске кода:

function getDepCountryFlag(dep) {
    airports.forEach((airport) => {
        if(airport.id == dep) {
            return airport.country_code;
        }
    });
}

– Вы делаете возврат из анонимной callback-функции, а не из функции getDepCountryFlag.

Answer 2
function getDepCountryFlag(dep) {
  var found = null;
  airports.forEach((airport) => {
    if (airport.id == dep && !found) {
      found = airport;
    }
  });
  return (found)? found.country_code : null;
}

А лучше:

function getDepCountryFlag(dep) {
  var found = airports.find((item) => item.id == dep);
  return (found)? found.country_code : null;
}
Answer 3

Если уж ты и реализуешь подобные алгоритмы, то делай это используя не только forEach, но и другие итераторы, например Array.find()

function getDepCountryFlag(dep) {
  const airPort = airports.find(airport => airport.id == dep);
  return airPort ? airPort. country_code : null;
}

Такой код намного читабельнее и локаничнее

Так же советую в JS всегда использовать строгое сравнение типов airport.id === dep, подробно про это можно почитать тут https://learn.javascript.ru/comparison

READ ALSO
Кроссбраузерный websocket

Кроссбраузерный websocket

Как сделать надежную поддержку websocket на тех браузерах где эта технология не работает? Вычитал что есть несколько сторонних библиотекНо вот...

249
Как запомнить option и label через куки

Как запомнить option и label через куки

Добрый день, друзья! Столкнулся с такой проблемойЗадача такая: необходимо вывести данные, которые указал пользователь в столбце select и данные...

237
javascript date как взять дату предыдущего дня?

javascript date как взять дату предыдущего дня?

Доброе утроСтолкнулся с такой проблемой, хочу взять дату предыдущего дня, но когда дата это первый день в году то работа даты javascript не корректная

293
SVG анимация графика

SVG анимация графика

Добрый день, подскажите как сделать так что бы "ползунок" не "дрифтовал" по графику, а плавно перетекал, как капля, и повторял изгибы графика?

222