Фильтровать массив элементов с помощью нового массива в JavaScript?

#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 Я думаю, что это все. Проверьте сейчас