#javascript
Вопрос:
У меня есть функция, которая возвращает мне результат, если я перешлю один параметр. Теперь я хочу изменить его, чтобы он мог возвращать результаты более чем по одному параметру, если я перешлю массив, чтобы вернуть мне все элементы, в которых есть этот массив? Например, если я пересылаю «Международный» и «Балканский», я хочу получить в результате ресторан1 и ресторан 3, потому что они включают в себя эти два типа, и это, если должно иметь оба типа, не или. Также еще одна проблема, с которой я сталкиваюсь здесь, заключается в том, что если я изменю последнюю строку кода в журнале консоли «Китайский» с категорией 1, то код не вернет результат?
function createRestaurant(name, address, averageMealPrice, numberOfTable, category, startTime, endTime) {
return {
name,
address,
averageMealPrice,
numberOfTable,
category,
startTime,
endTime
};
}
function createCategory(type) {
return {
type
};
}
const category1 = createCategory('Chinese');
const category2 = createCategory('International');
const category3 = createCategory('Balkan');
const category4 = createCategory('Indian');
let restaurant1 = createRestaurant('Rosetto', 'Boulevar 2', 500, 71, ['Chinese', 'International', 'Balkan', 'Indian'], 8, 20);
let restaurant2 = createRestaurant('McDonalnds', 'Promenada', 300, 30, ['Indian', 'International'], 1, 21);
let restaurant3 = createRestaurant('Piknik', 'Iceland', 660, 40, ['Balkan', 'International'], 11, 22);
let restaurants = [restaurant1, restaurant2, restaurant3];
function findRestaurantsByCategory(restaurantsByCategory, category){
const result = [];
for (let i = 0; i < restaurantsByCategory.length; i ) {
if (restaurantsByCategory[i].category.includes(category)) {
result.push(restaurantsByCategory[i]);
}
}
return resu<
}
console.log(findRestaurantsByCategory(restaurants, 'Chinese'));
Комментарии:
1.Ваш
category1
— это объект, подобный{ type : 'Chinese' }
. Поэтому, если вы вызоветеfindRestaurantsByCategory
, передав этот объект. ВfindRestaurantsByCategory
category = { type : 'Chinese' }
, Так что вашrestaurantsByCategory[i].category.includes(category)
никогда не удовлетворит. Это будет похоже на сравнение['Chinese', 'International', 'Balkan', 'Indian'].includes({ type : 'Chinese' })
, которое никогда не будет правдой
Ответ №1:
Нам нужно изменить findRestaurantsByCategory(restaurantsByCategory
сигнатуру функции, чтобы она принимала несколько параметров. Мы можем сделать это, используя параметр Rest.
Тогда внутри findRestaurantsByCategory
мы получим category
в виде массива, который содержит все параметры, исключая первый параметр.
Так что, если мы будем так звонить findRestaurantsByCategory(restaurants, 'Chinese', 'Indian', 'Balkan')
, мы получим category = ['Chinese', 'Indian', 'Balkan']
.
function createRestaurant(name, address, averageMealPrice, numberOfTable, category, startTime, endTime) {
return {
name,
address,
averageMealPrice,
numberOfTable,
category,
startTime,
endTime
};
}
function createCategory(type) {
return {
type
};
}
const category1 = createCategory('Chinese');
const category2 = createCategory('International');
const category3 = createCategory('Balkan');
const category4 = createCategory('Indian');
let restaurant1 = createRestaurant('Rosetto', 'Boulevar 2', 500, 71, ['Chinese', 'International', 'Balkan', 'Indian'], 8, 20);
let restaurant2 = createRestaurant('McDonalnds', 'Promenada', 300, 30, ['Indian', 'International'], 1, 21);
let restaurant3 = createRestaurant('Piknik', 'Iceland', 660, 40, ['Balkan', 'International'], 11, 22);
let restaurants = [restaurant1, restaurant2, restaurant3];
function findRestaurantsByCategory(restaurantsByCategory, ...category){
return restaurantsByCategory.filter(restaurantCat => isAllMatched(restaurantCat.category, category));
}
function isAllMatched(rCatogory, toBeMatchedCategory){
for(let x =0; x < toBeMatchedCategory.length; x ){
if(!rCatogory.includes(toBeMatchedCategory[x])){
return false;
}
}
return true;
}
console.log(findRestaurantsByCategory(restaurants, 'Chinese', 'International', 'Balkan', 'Indian'));
//console.log(findRestaurantsByCategory(restaurants, 'Balkan', 'International'));
console.log(findRestaurantsByCategory(restaurants, 'Indian', 'International'));
Комментарии:
1. @navanth Привет, спасибо. Но если я запущу сниппет, это вернет все рестораны, мне не нужны все, у кого есть хотя бы один из этой категории. Если вы переадресуете китайский, индийский, Балканский, мне нужны только рестораны, в которых есть все эти три категории, а не хотя бы одна из них, что означает, что результатом для китайского, индийского и балканского будет только ресторан 1…
2. @MAlex, если мы пройдем
'Chinese', 'International'
, каким будет результат, учитывая вышеупомянутый пример. Вы ищете точное соответствие или должны иметь все предоставленные категории3. @navanth Я надеюсь, что и китайский, и международный будут включены, например, в ресторан1, а не в один из них.
4. @navanth Это работает, например, для console.log(найдите категорию ресторанов(рестораны, «Балканские», «Международные»)); Но если я добавлю еще один, например «Балканский», «Международный», «Индийский», я получу пустой массив… Но я должен пойти в ресторан1.
5. @MAlex Я думаю, что это все. Проверьте сейчас