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