Создайте функцию с именем priceLookup, чтобы найти цену одного товара

#javascript #function #if-statement

#javascript #функция #if-оператор

Вопрос:

Впервые публикую здесь. Я немного застрял. Назначение выглядит следующим образом:

Создайте функцию с именем priceLookup, чтобы найти цену одного товара. Функция должна принимать массив товаров и имя товара (строку) в качестве параметров и возвращать цену товара с этим именем. Если товар не может быть найден, верните строку «Товар с таким именем не найден»

** Предположим, что эти тестовые данные могут быть другими аргументами, введенными в функцию ** (я думаю, что я использовал правильную терминологию)

// Тестовые данные для проблем

 let items = [
  {
    itemName: "Effective Programming Habits",
    type: "book",
    price: 13.99
  },
  {
    itemName: "Creation 3005",
    type: "computer",
    price: 299.99
  },
  {
    itemName: "Finding Your Center",
    type: "book",
    price: 15.00
  }
]
  

Вот мой код и где я застрял:

 function priceLookup(items, name){
 let result = 0;
 for (i = 0; i < items.length; i  ){
   if (name == items[i].itemName){
   (result =  items[i].price)
   } else { result = "No item found with that name"
      }
  }
  return resu<
 }
  

Итак, я думаю, мой вопрос в том, почему мой оператор else отменяет if перед ним? Если я удалю это, я пройду тестирование при вызове имени, но потерплю неудачу, если имя не существует, и оно покажет «Товар не найден с этим именем»

Ответ №1:

 function priceLookup(items, name) {
  let result = 0;
  for (i = 0; i < items.length; i  ) {
    if (name == items[i].itemName) {
      result  =  items[i].price;
    }
  }
  if (result === 0) {
    return "No item found with that name";
  }
  return resu<
}
  

Ответ №2:

Когда вы найдете совпадение, немедленно верните его. Нет необходимости просматривать остальные товары.

Что касается «Товар не найден» … возвращайте его только после завершения цикла.

В настоящее время происходит то, что, как только найден элемент, который не соответствует, вы меняете результат с числа на строку сообщения, и цикл продолжает проходить через другие элементы в массиве

 function priceLookup(items, name) {

  for (let i = 0; i < items.length; i  ) {
    if (name === items[i].itemName) {
      // the return will break the loop and exit the function
      return items[i].price;
    }
  }
  // if loop completes no matches were found
  return "No item found with that name"
}
  

Другие примечания: не создавайте i глобальную переменную и не используйте === для проверки равенства

Комментарии:

1. Спасибо! Что касается ваших заметок, что вы имеете в виду, говоря «не делайте i глобальной переменной»? Извините, я буквально начал полный учебный лагерь stack около 2 недель назад с 0 знаниями в области программирования, поэтому моя терминология, безусловно, нуждается в данный момент. Понял на === как это более строго правильно?

2. Когда вы объявляете переменные с var, let or const помощью, они доступны только в том scope , в котором они объявлены. Они не могут быть доступны за пределами этой области или сталкиваться с другими переменными с тем же именем в области более высокого уровня. Глобальный означает, что он доступен в любом месте базы кода. Поэтому, если ваша следующая функция также использовала переменную i , они могут столкнуться. Выполните быстрый поиск базового руководства по scope. В этом есть много нюансов, но простое понимание концепции высокого уровня на данный момент поможет вам двигаться дальше

Ответ №3:

Массив.find — ваш друг. Обычно меньше ошибок и эффективнее использовать встроенный, а не использовать свой собственный.

Таким образом, ваша функция будет:

 function priceLookup(items, name) {
    let ret = items.find( x => x.itemName === name);
    return ret ? ret.price : "No such item";
}
  

Комментарии:

1. О, да, это выглядит намного проще. Я думаю, поскольку мы еще не дошли до этого, я не слишком много знал о array.find. Я не могу себе представить, что если я узнаю что-то на стороне, как здесь, это будет осуждено. Спасибо за объяснение!

2. PS: В современных браузерах (Chrome, FF, Safari) вы можете использовать необязательные операторы объединения в цепочки и объединения с нулем, чтобы сделать это еще более компактным. return (items.find(x => x.itemName === name))?.price ?? "No such item";

Ответ №4:

 function priceLookup(items, obj) {
    for (let i = 0; i < items.length; i  ) {
        if (items[i].itemName == obj) {
            return items[i].price
        }
    }
    return undefined
}