繁体   English   中英

链接多个过滤器(如果存在条件)

[英]Chaining multiple filters if condition exist

我正在尝试根据两个也可能为空的参数范围(数组)将两个过滤器链接起来,因此f.ex很有可能。 speedlimit=[]

var speedfilter =[240,300]
var pricefilter = [80,120]
var cars = [
  {name:'Ferrari', maxspeed:240, price: 100},
  {name:'Porsche', maxspeed:220, price: 90},
  {name:'Bugatti', maxspeed:300, price: 500}
  ];


if (speedfilters) {
  return cars.filter(function (car) {
    return car.maxspeed >= speedfilter[0] && car.maxspeed <= speedfilter[1];
  })
} else if (pricefilter) {
  return cars.filter(function (car) {
    return car.price >= pricefilter[0] && car.price <= pricefilter[1];
  })
}
else return cars

上例中的结果应输出{name:'Ferrari', speed:240, price: 100}

使用javascript filter的方式是什么? 提前致谢!

您可以通过原型继承创建filterCar方法

Array.prototype.filterCar = function(feature, range) {
   return this.filter((el) => {
     // is the range defined?
     if (!!range.length) {
        return el[feature] >= range[0] && el[feature] <= range[1];
     }
     else {
        return true;
     }
   })
};


var cars = [
  {name:'Ferrari', speed:240, price: 100},
  {name:'Porsche', speed:220, price: 90},
  {name:'Bugatti', speed:300, price: 500}
 ];

var result1 = cars.filterCar('speed', [240, 300])
                  .filterCar('price', [80, 120]));

var result2 = cars.filterCar('speed', [ ])
                  .filterCar('price', [80, 120]));



console.log(result1); // [{name: "Ferrari", speed: 240, price: 100}]

console.log(result2); /* [{name: "Ferrari", speed: 240, price: 100}, 
                         {name: "Porsche", speed: 220, price: 90}] */

您可以将过滤器包装为可重用的方法,这可以说明过滤器不可用。

function filterCars(carsArray, property, rangeArray) {
   // if rangeArray is not supplied, or is empty, just return the unfiltered input
   if(!rangeArray|| rangeArray.length === 0) {
      return carsArray;
   }
   // otherwise filter according to logic
   return carsArray.filter(car => car[property] >= rangeArray[0] && car[property] <= rangeArray[1]);
}

可以将其链接起来,或者为了提高可读性依次调用:

  function filterCars(carsArray, property, rangeArray) { if(!rangeArray|| rangeArray.length === 0) { return carsArray; } return carsArray.filter(car => car[property] >= rangeArray[0] && car[property] <= rangeArray[1]); } var speedfilter = []; // [240,300] var pricefilter = [80,120] var cars = [ {name:'Ferrari', maxspeed:240, price: 100}, {name:'Porsche', maxspeed:220, price: 90}, {name:'Bugatti', maxspeed:300, price: 500} ]; cars = filterCars(cars,"maxspeed",speedfilter); cars = filterCars(cars,"price",pricefilter); console.log(cars); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM