如何重构Javascript中的方法

时间:2019-02-13 09:12:32

标签: javascript refactoring

我编写了以下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);

我该如何重构以过滤器文本作为参数的方法?

如何将所有这些重构为一个方法,该方法将过滤器文本和类型作为参数?

4 个答案:

答案 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);
}