简体   繁体   English

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

[英]Chaining multiple filters if condition exist

I'm trying to chain two filters, based in two ranges (arrays) of params that may also be empty, so it would be possible that f.ex. 我正在尝试根据两个也可能为空的参数范围(数组)将两个过滤器链接起来,因此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

The result in the example above should output {name:'Ferrari', speed:240, price: 100} 上例中的结果应输出{name:'Ferrari', speed:240, price: 100}

What would be the way to do it with javascript filter ? 使用javascript filter的方式是什么? Thanks in advance! 提前致谢!

You could create a filterCar method via prototype inheritance 您可以通过原型继承创建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}] */

You can wrap your filtering up into a re-usable method, and this can account for the filter not being available. 您可以将过滤器包装为可重用的方法,这可以说明过滤器不可用。

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]);
}

This can be chained, or for more readability called in sequence: 可以将其链接起来,或者为了提高可读性依次调用:

  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