#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
}