На данный вопрос уже ответили:
Привет. С недавних пор решил перейти с 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 заработал?
В этом куске кода:
function getDepCountryFlag(dep) {
airports.forEach((airport) => {
if(airport.id == dep) {
return airport.country_code;
}
});
}
– Вы делаете возврат из анонимной callback-функции, а не из функции getDepCountryFlag.
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;
}
Если уж ты и реализуешь подобные алгоритмы, то делай это используя не только 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
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости