Почему не работает фильтр по свойствам класса?

189
05 июля 2018, 03:50

Я хочу реализовать метод для фильтрации товаров по указанным опциям. Метод принимает в качестве параметра объект 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" 
}));

Answer 1
//С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.

READ ALSO
Почему не вызывается функция из консоли браузера?

Почему не вызывается функция из консоли браузера?

Пишу нижеследующий кодПри загрузке страницы в консоль попадает 111

175
Как устранить ошибку при подключении JSON?

Как устранить ошибку при подключении JSON?

Может быть кто-нибудь сталкивался с такой ошибкой в Nodejs:

204
что делает метод push для js объекта?

что делает метод push для js объекта?

Метод push - ничего не делает для объекта, потому по умолчанию у объектов нет такого метода

189