Рейтинг:
1
Jon McKee
Ответ ниже, но сначала несколько советов:
1) Как правило, это плохая идея объявлять что-либо const в глобальном масштабе.
2) Вам не нужно объявлять неиспользуемые параметры в Javascript; это просто так.
3) просто потому, что JS холоден и обычно не суетится вокруг точек с запятой, это не значит, что вы не должны их использовать.
4) в Javascript MDN[^] является единственным лучшим ресурсом (imo) для изучения JS, а также ссылки на то, как почти все работает в JS.
4а) почему вы получаете undefined-это ведь инструкция foreach[^возвращаемое значение] определяется как неопределенное.
У тебя почти получилось. Используйте вложенный файл find
вместо forEach
. forEach
это делается для того, чтобы что-то сделать с каждым элементом коллекции, а не для того, чтобы найти и вернуть элемент коллекции :) С некоторой очисткой и исправлениями:
let cruiseLines = [{
Liner: 'Royal Carribean',
shipName: ['Symphony of the Seas', 'Vision of the Seas']
},{
Liner: 'Disney Cruise Line',
shipName: ['Disney Magic', 'Disney Spinner', 'Disney Swan']
}];
let findShip = function (targetShip){
return cruiseLines.find(function (cruiseLine){
return cruiseLine.shipName.includes(targetShip);
});
};
let lookShip = findShip('Disney Spinner');
console.log(lookShip);
Если вы не хотите возвращать весь объект и только имя (не знаю, зачем вам это нужно, но перечитывая ваш вопрос, я не уверен):
let cruiseLines = [{
Liner: 'Royal Carribean',
shipName: ['Symphony of the Seas', 'Vision of the Seas']
},{
Liner: 'Disney Cruise Line',
shipName: ['Disney Magic', 'Disney Spinner', 'Disney Swan']
}];
let findShip = function (targetShip){
let shipName;
cruiseLines.forEach(function (cruiseLine){
shipName = cruiseLine.shipName.find(function (ship){
return ship === targetShip;
});
});
return shipName;
};
let lookShip = findShip('Disney Spinner');
console.log(lookShip);
Если вышеизложенное-это то, что вы хотите, я бы предпочел этот подход, так как вам нужно знать только, существует ли имя, а не то, что оно есть (вы уже ищете с этим именем):
let cruiseLines = [{
Liner: 'Royal Carribean',
shipName: ['Symphony of the Seas', 'Vision of the Seas']
},{
Liner: 'Disney Cruise Line',
shipName: ['Disney Magic', 'Disney Spinner', 'Disney Swan']
}];
let findShip = function (targetShip){
for (let cruiseLine of cruiseLines)
if(cruiseLine.shipName.includes(targetShip))
return true;
return false;
};
let lookShip = findShip('Disney Spinner');
console.log(lookShip);
sonicJS
Большое тебе спасибо, Джон! Это очень помогло мне лучше понять, как кодировать с помощью функций и размещения переменной для получения возвращаемого значения. Я проверил ваши предложения, и, конечно, это сработало. Спасибо еще раз.
sonicJS
Привет Джон,
После дальнейшего тестирования, используя первое решение, он правильно возвращает названия судов, которые перечислены под круизной линией Disney. Но если я передаю в аргумент функции любое из названий кораблей Roybal Carribean, он возвращает "undefined". Я не понимаю, почему ...
Jon McKee
Где вы тестируете Javascript? Я использую свою консоль браузера, и она отлично работала для меня, когда я только что протестировал ее.
sonicJS
Я запускаю его с помощью VS-кода.
Jon McKee
Тогда я попробую отладить код: https://code.visualstudio.com/docs/editor/debugging
Я не могу воспроизвести эту проблему, и у меня нет VSCode.
sonicJS
Ладно, я все отлажу ...
sonicJS
Во время отладки я обнаружил, что вместо того, чтобы пропустить функцию сравнения других названий кораблей после того, как она нашла "Vision of the Seas", она продолжала сравнивать больше названий кораблей вплоть до" Disney Swan", что привело бы к" undefined " для console.log(lookShip).
Jon McKee
Я думаю, что знаю, что происходит, попробуйте это (работает для меня в браузере; объяснение ниже):
let findShip = function (targetShip){
return cruiseLines.find(function (cruiseLine){
return cruiseLine.shipName.includes(targetShip);
});
};
Поэтому я думаю, что это может быть связано с принуждением типа. Итак, функция, которая передается в
find
должен возвращать логическое значение, указывающее, что возвращаемое значение найдено. В исходном коде ниже я поместил типы возвращаемых значений в скобки, чтобы проиллюстрировать их:
let findShip = function (targetShip){
return [object] cruiseLines.find(function (cruiseLine){
return [string] cruiseLine.shipName.find(function (ship){
return [boolean] ship === targetShip;
});
});
};
Итак, то, к чему я привык с JS, - это то, что", 0, -0, null, undefined и NaN все преобразуются в логическое значение false, а все остальное преобразуется в true. Но то, что может произойти по причинам, в которых я не уверен, заключается в том, что этот второй тип возвращаемой строки по какой-то причине преобразуется в false, и именно поэтому
find
продолжает идти.
sonicJS
Спасибо, что ответили. Сейчас я экспериментирую над тем, как остановить .find (), когда совпадение найдено.