Как мне заставить функцию возвращать разные значения в зависимости от того, что передается через функцию?

#javascript #arrays #loops #if-statement #return

#javascript #массивы #циклы #if-оператор #Возврат

Вопрос:

У меня возникли проблемы с правильной работой моей функции. В зависимости от условий я хочу, чтобы моя функция возвращала новый массив путем ввода в новый массив. Если условия if являются ложными, я хочу вернуть два разных строковых сообщения. Вот пример моего набора данных:

 let items = [
  { 
    itemName: "Effective Programming Habits", 
    type: "book", 
    price: 18.99
  },
  {
    itemName: "Creation 3005", 
    type: "computer",
    price: 399.99
  },
  {
    itemName: "Orangebook Pro", 
    type: "computer",
    price: 899.99
  }
  

До сих пор, когда моя функция принимает массив элементов и тип элемента в качестве слова поиска строки, она возвращает массив элементов, тип которых соответствует типу, переданному через функцию. Однако я также хочу, чтобы моя функция возвращала две другие вещи.

Если в массиве корзины нет товаров, верните строку «В вашей корзине нет товаров». Разве это не было бы записано как matches.length === 0 ? Если нет элементов, соответствующих данному типу, верните строку «Не найдено элементов этого типа. Пожалуйста, найдите другой элемент.». Разве это не было бы записано как if (search != items[i].type) ?

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

 function findItems (items, search) {
  let matches = [];
  for (i = 0; i < items.length; i  ) {
    if (items[i].type.includes(search)) {
      matches.push(items[i])
    }
  }
  return matches;
}
  

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

Ответ №1:

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

 let items = [{
    itemName: "Effective Programming Habits",
    type: "book",
    price: 18.99
  },
  {
    itemName: "Creation 3005",
    type: "computer",
    price: 399.99
  },
  {
    itemName: "Orangebook Pro",
    type: "computer",
    price: 899.99
  }
];

function findItems(items, search) {
  if (items.length === 0) {
    return "Your cart does not have any items in it.";
  }
  let matches = [];
  for (i = 0; i < items.length; i  ) {
    if (items[i].type.includes(search)) {
      matches.push(items[i])
    }
  }
  if (matches.length === 0) {
    return "No items found of that type. Please search for a different item."
  }
  return matches;
}

console.log(findItems(items, 'computer'));
console.log(findItems(items, 'software'));
console.log(findItems([], 'computer'));  

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

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

1. Спасибо за этот ответ. Я знал, что у меня есть все части, но я писал их в неправильном порядке. Теперь я понимаю, что проверка на наличие if items.length === 0 не требует выполнения цикла for . Эти данные уже были предоставлены нам, и мы можем проверить это условие, прежде чем мы даже переберем массив. Вот почему это должно быть первым. Как только у нас будет наш массив совпадений, если совпадений нет, мы можем проверить, matches.length === 0 но только после того, как мы использовали метод push. В противном случае это всегда будет возвращать значение true, потому что мы намеренно устанавливаем длину массива равной 0.

2. @ElinaMcGill действительно, у вас были все части. Объяснение, которое вы написали в этом комментарии, прекрасно описывает, как код должен и работает.

Ответ №2:

Вы также можете добиться этого с помощью Array.filter .

 let items = [{itemName:"Effective Programming Habits",type:"book",price:18.99},{itemName:"Creation 3005",type:"computer",price:399.99},{itemName:"Orangebook Pro",type:"computer",price:899.99}];

const filterItems = (items, searchText) => {
  if(items.length === 0) {
    return "Your cart does not have any items in it.";
  } 
  const filteredItems = items.filter(item => item.type.includes(searchText));
  return filteredItems.length === 0 ? "No items found of that type. Please search for a different item.": filteredItems;
}

//One matching type from the list
console.log(filterItems(items, "book"));
//No matching types from the list
console.log(filterItems(items, "not found"));
//When the cart items are empty
console.log(filterItems([], "book"));
//Multiple matching types form the list
console.log(filterItems(items, "computer"));  
 .as-console-wrapper {
  max-height: 100% !important;
}  

Ответ №3:

Вместо возврата массива элементов вы можете вернуть объект. Затем, когда вы используете возвращаемое значение функции, вы можете проверить свойства объекта, чтобы получить сообщение или что-то еще, что вы надеетесь получить. Проверьте объект outputVal в следующей функции.

 function findItems (items, search) {
      let outputVal = { Message: "", 
                        matches: [] }
      
      for (i = 0; i < items.length; i  ) {
        if (items[i].type.includes(search)) {
          outputVal.matches.push(items[i])
        }
      }
      if(outputVal.matches.length==0){
        outputVal.Message = "No Items Found!"
      }
      return outputVal;
    }