[英]how can I refactor methods in Javascript
我編寫了以下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);
如何重構以過濾器文本作為參數的方法?
以及如何將所有這些重構為一個方法,該方法將過濾器文本和類型作為參數?
您可以將過濾器移到一個數組中,然后檢查是否只有一個過濾器與實際汽車(或狀況)匹配,或者所有過濾器與汽車(和狀況)匹配。
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)));
我會選擇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"))
您可以像這樣重構
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 } })
您可以創建一個這樣的函數來接受參數,並根據自己的喜好將AND(&&)替換為OR(||),如果它應該匹配所有參數或至少一個參數。
function filterCars(year, make, price) {
return cars.filter(c => c.year > year && c.make === make && c.price < price);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.