我编写了以下3种方法:
方法。 1:
var carYear = cars.filter(function(item) {
if (item.year > 1999) {
return item;
};
})
方法。 2
var carVolvo = cars.filter(function(item) {
if (item.make == 'Volvo') {
return item;
};
});
方法。 3
var carPrice = cars.filter(item => item.price < 5000);
我该如何重构以过滤器文本作为参数的方法?
如何将所有这些重构为一个方法,该方法将过滤器文本和类型作为参数?
答案 0 :(得分:1)
您可以将过滤器移到一个数组中,并检查是否只有一个过滤器与实际汽车(或状况)匹配,或者所有过滤器与汽车(和状况)匹配。
filters = [
item => item.year > 1999,
item => item.make == 'Volvo',
item => item.price < 5000
];
onlyOneFilter = cars.filter(car => filters.some(fn => fn(car)));
allFilters = cars.filter(car => filters.every(fn => fn(car)));
答案 1 :(得分:1)
我会坚持Nina Scholz的方法。无论是对OP问题的100%合规回答
我该如何重构以过滤器文本作为参数的方法?
function filterSwitcher(filterText) {
switch(filterText) {
case "year":
return item => item.year > 1999
case "make":
return item => item.make == 'Volvo'
case "price":
return item => item.price < 5000
}
}
cars.filter(filterSwitcher("price"))
答案 2 :(得分:0)
您可以像这样重构
var arrs = [{price:1500},{price:1900},{price:2000}]
var obj = {a:[],b:[],c:[]}
arrs.filter(function(item){
if(item.price<1600){
obj.a.push(item)
return
}else if(item.price<2000) {
obj.b.push(item)
return
}else{
obj.c.push(item)
return
}
})
答案 3 :(得分:0)
您可以创建一个这样的函数来接受参数,并根据自己的喜好将AND(&&)替换为OR(|||)(如果它应该匹配所有参数或至少一个参数)。
function filterCars(year, make, price) {
return cars.filter(c => c.year > year && c.make === make && c.price < price);
}