首页 > 解决方案 > JS:如何创建返回相同价格范围内所有餐厅列表的函数?

问题描述

我有一个具有创建餐厅和价格范围功能的程序,我需要返回功能相同价格范围的所有餐厅,我不知道如何?这是我的代码,函数名称是 findRestaurantsByPriceRange,我正在尝试检查范围类别是否相同,但不确定如何?注意:不允许使用过滤器。如果可能的话,我想用 for 或 foreach 来做?

function createRestaurant(name, address, averageMealPrice, numberOfTable, category, priceRange, size) {
    return { name, address, averageMealPrice, numberOfTable, category, priceRange, size };
  }
  
  
  function createCategory(type) {
    return { type };
  }
  
  function createSizeOfRestaurant(size) {
    return { size };
  }
  
  
  let category1 = createCategory(['Chinese', 'International']);
  let category2 = createCategory(['Fast food', 'Middle Eastern']);
  let category3 = createCategory(['Balkan', 'Indian']);
  
  let size1 = createSizeOfRestaurant('small');
  let size2 = createSizeOfRestaurant('medium');
  let size3 = createSizeOfRestaurant('big');
  
  //THIS IS RANGE
  let range = ['inexpensive', 'moderate', 'expensive'];
  
  let restaurant1 = createRestaurant('Rosetto', 'Bulevar Oslobodjenja 2', 500, 20, category1, range[0], size1);
  let restaurant2 = createRestaurant('Rosetto', 'Bulevar Oslobodjenja 2', 500, 20, category2, range[1], size2);
  let restaurant3 = createRestaurant('Rosetto', 'Bulevar Oslobodjenja 2', 500, 20, category3, range[2], size3);
  
  let restaurants = [restaurant1, restaurant2, restaurant3];
  
  function findRestaurantsByPriceRange(restaurantByPrice, category) {
    const result = [];
  
    for (let i = 0; i < restaurantByPrice.length; i++) {
      let valid = false;
      const restaurant = restaurantByPrice[i];
      // To break the loop without it going through all the items in the array, I check if valid has been set to true. If so, the loop breaks
      for (let j = 0;
        (j < restaurant.category.type.length && valid === false); j++) {
        const restaurantCategory = restaurant.category.type[j];
        if (restaurantCategory === category) {
          valid = true;
        }
      }
  
      if (valid === true) result.push(restaurant)
    }
    
    return result;
  }
  
  function findRestaurantByCategory(restaurantsByCategory, category) {
    const result = [];
  
    for (let i = 0; i < restaurantsByCategory.length; i++) {
      let valid = false;
      const restaurant = restaurantsByCategory[i];
      for (let j = 0; (j < restaurant.category.type.length && valid === false); j++) {
        const restaurantCategory = restaurant.category.type[j];
        if (restaurantCategory === category) {
          valid = true;
        }
      }
  
      if (valid === true) result.push(restaurant)
    }
    
    return result;
  }

  function findRestaurantsBySize(restaurantsBySize, size){
    const result = [];
  
    for (let i = 0; i < restaurantsBySize.length; i++) {
      let valid = false;
      const restaurant = restaurantsBySize[i];
      for (let j = 0; (j < restaurant.size.type.length && valid === false); j++) {
        const restaurantSize = restaurant.size.type[j];
        if (restaurantSize === size) {
          valid = true;
        }
      }
  
      if (valid === true){ 
        result.push(restaurant)
      }
    }
    
    return result;
  }

  console.log(findRestaurantByCategory(restaurants, 'Chinese'))
  console.log(findRestaurantsBySize(restaurants, 'small'));

标签: javascript

解决方案


Array#includesArray#some与前两种方法一起使用

使用Array#filter

function findRestaurantsByPriceRange(restaurantByPrice, category){
    return restaurantByPrice.filter(({ category: restaurantCategory }) => restaurantCategory.some(item => category.type.includes(item)));
}

使用Array#reduce

function findRestaurantsByPriceRange(restaurantByPrice, category) {
  return restaurantByPrice.reduce((acc, restaurant) => {
  acc.push(restaurant.category.some(item => category.type.includes(item)) ? restaurant : ...[])
  return acc;
  }, []);
}

使用for循环

在这里,您必须遍历restaurantByPrice数组及其category数组,使用标志来检查是否有任何餐厅的类别与传递给函数的类别匹配。

function findRestaurantsByPriceRange(restaurantByPrice, category) {
  const result = [];
  
  for (let i = 0; i < restaurantByPrice.length; i++) {
    let valid = false;
    const restaurant = restaurantByPrice[i];
    
    // To break the loop without it going through all the items in the array, I check if valid has been set to true. If so, the loop breaks
    for (let j = 0; (j < restaurant.category.length && valid === false); j++) {
      const restaurantCategory = restaurant.category[j];

      if (restaurantCategory === category) {
        valid = true;
      }
    }

    if (valid === true) result.push(restaurant)
  }

function createRestaurant(name, address, averageMealPrice, numberOfTable, category, priceRange, size) {
  return { name, address, averageMealPrice, numberOfTable, category, priceRange, size };
}


function createCategory(type) {
  return { type };
}

function createSizeOfRestaurant(size) {
  return { size };
}


let category1 = createCategory(['Chinese', 'International']);
let category2 = createCategory(['Fast food', 'Middle Eastern']);
let category3 = createCategory(['Balkan', 'Indian']);

let size1 = createSizeOfRestaurant('small');
let size2 = createSizeOfRestaurant('medium');
let size3 = createSizeOfRestaurant('big');

//THIS IS RANGE
let range = ['inexpensive', 'moderate', 'expensive'];

let restaurant1 = createRestaurant('Rosetto', 'Bulevar Oslobodjenja 2', 500, 20, category1, range[0], size1);
let restaurant2 = createRestaurant('Rosetto', 'Bulevar Oslobodjenja 2', 500, 20, category2, range[1], size2);
let restaurant3 = createRestaurant('Rosetto', 'Bulevar Oslobodjenja 2', 500, 20, category3, range[2], size3);

let restaurants = [restaurant1, restaurant2, restaurant3];

function findRestaurantsByPriceRange(restaurantByPrice, category) {
  const result = [];

  for (let i = 0; i < restaurantByPrice.length; i++) {
    let valid = false;
    const restaurant = restaurantByPrice[i];
    // To break the loop without it going through all the items in the array, I check if valid has been set to true. If so, the loop breaks
    for (let j = 0;
      (j < restaurant.category.type.length && valid === false); j++) {
      const restaurantCategory = restaurant.category.type[j];
      if (restaurantCategory === category) {
        valid = true;
      }
    }

    if (valid === true) result.push(restaurant)
  }
  
  return result;
}

console.log(findRestaurantsByPriceRange(restaurants, 'Chinese'))


检查size

function findRestaurantsByPriceRange(restaurantByPrice, size) {
  const result = [];

  for (let i = 0; i < restaurantByPrice.length; i++) {
    const restaurant = restaurantByPrice[i];
    if (restaurant.size.size === size) result.push(restaurant);
  }
  
  return result;
}

推荐阅读