Переключение нескольких фильтров при условии существования

var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
0
задан Joe82 13 July 2018 в 16:08
поделиться

2 ответа

Вы можете создать метод 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}] */
2
ответ дан fcalderan 17 August 2018 в 12:27
поделиться
  • 1
    filterCar на прототипе Array .... не совсем «правильно». Может / должен был быть только вызовом метода. Также не покрывает & quot ;, если существует & quot; требование. – Jamiec 13 July 2018 в 16:07
  • 2
    это просто пример того, как использовать функцию filter. Не понимаю нисходящее отношение. – fcalderan 13 July 2018 в 16:12
  • 3
    Не мое! Обещаю. – Jamiec 13 July 2018 в 16:13
  • 4
    Я не спускал вниз, но не главный вопрос о том, как обращаться с пустым диапазоном? – Mark Meyer 13 July 2018 в 16:15
  • 5
    @ Joe82 теперь он делает через if...else внутри фильтра BTW – Jamiec 13 July 2018 в 16:19

Вы можете перенести свою фильтрацию в повторно используемый метод, и это может объяснить, что фильтр недоступен.

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

1
ответ дан Jamiec 17 August 2018 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: