Я хочу реализовать метод для фильтрации товаров по указанным опциям. Метод принимает в качестве параметра объект options
, который содержит параметры для поиска например: {name: "item 2", price: "<= 1000", count: "> = 2"}
, каждый из параметров является опциональными. Метод должен возвращать отфильтрованный массив с товарами. filterProductBy (options)
.
Обязательно: необходимо вытащить параметры из этого объекта через деструктурирование
//Product Creation Class
class Product {
constructor(name, count, price) {
this.name = name;
this.count = count;
this.price = price;
}
}
//Сlass where products are recorded
class Shop {
constructor(products) {
this.products = [];
}
//method for adding a product
addProduct(newProduct) {
this.products.push(newProduct);
}
//method for filtering products by specified parameters
filterProductBy(options) {
let {name, count, price} = options;
const getEvaluation = filterString => filterString.indexOf('>=') > -1 ?
(number, amount) => number >= amount :
(number, amount) => number <= amount;
const filteredName = this.products.filter(product => {
return product.name === undefined || product.name === name
});
const filteredCount = this.products.filter(product =>{
return product.count === undefined ||
getEvaluation(count)(product.count, count.match(/(\d+)/)[0])
});
const filteredPrice = this.products.filter(product =>{
return product.price === undefined ||
getEvaluation(price)(product.price, price.match(/(\d+)/)[0])
});
return this.products.filter(options);
}
}
const shop = new Shop();
shop.addProduct(new Product("product 1", 1, 2000));
shop.addProduct(new Product("item 2", 2, 100));
shop.addProduct(new Product("some 3", 3, 500));
shop.addProduct(new Product("anything 4", 4, 1000));
console.log(shop.filterProductBy({
name: "anything 4",
count: ">3",
price: ">=500"
}));
//Сlass where products are recorded
class Shop {
constructor(products) {
this.products = [];
}
//method for adding a product
addProduct(newProduct) {
this.products.push(newProduct);
}
//method for filtering products by specified parameters
filterProductBy(options) {
const optionName = options.name,
optionCount = options.count,
optionPrice = options.price;
const filters = {
byName: function (actualName, optionName) {
// Фильтр будет пройден, если имя продукта (actualName) не задано или равняется optionName
return (actualName === undefined) || (actualName === optionName);
},
byCount: function (actualCount, optionCount) {
// тут ваша логика
// заглушка
return true;
},
byPrice: function (actualPrice, optionPrice) {
// тут ваша логика
// заглушка
return true;
}
}
return this.products.filter(
// функция фильтрации пропустит товар, если все фильтры вернут true
(product) => filters.byName(product.name, optionName)
&& filters.byCount(product.count, optionCount)
&& filters.byPrice(product.price, optionPrice));
}
}
Добавьте реализацию в методы filters.byCount
и filters.byPrice
по аналогии с filters.byName
и должно заработать.
При желании, объект filters
можно вынести из тела метода, дабы не создавать его при каждом вызове функции filterProductBy
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Пишу нижеследующий кодПри загрузке страницы в консоль попадает 111
Может быть кто-нибудь сталкивался с такой ошибкой в Nodejs:
Метод push - ничего не делает для объекта, потому по умолчанию у объектов нет такого метода