sonicJS Ответов: 1

Как мне вернуть значение из "программы" обратно в вызывающую функцию "помощью этого приложения"?


Я новичок. Я изо всех сил пытаюсь построить эту функцию в кодах функций, чтобы извлечь значение во вложенном массиве "shipName", который находится внутри объекта массива, используя функцию .find (). Я смог написать эти коды функций, но как мне вернуть значение переменной "findIt" обратно вызывающей функции? Пожалуйста, поправьте меня, если мой способ написания этой функции в коде функции неуместен. Ниже приведены мои коды. В настоящее время я получаю возвращаемое значение "undefined".

Мы искренне ценим ваш вклад и советы. Спасибо!

Что я уже пробовал:

const cruiseLines = [{
    Liner: 'Royal Carribean',
    shipName: ['Symphony of the Seas', 'Vision of the Seas']
},{
    Liner: 'Disney Cruise Line',
    shipName: ['Disney Magic', 'Disney Spinner', 'Disney Swan']
}]

const findShip = function (cruises, ships) {
    cruiseLines.forEach (function (cruiseLines, index){
        const findIt = cruiseLines.shipName.find(function (ship, index2){
            console.log(ship === ships)
        })
        return findIt
    })
    
}
const lookShip = findShip (cruiseLines.shipName, 'Disney Spinner')
console.log(lookShip)  

1 Ответов

Рейтинг:
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 (), когда совпадение найдено.