JavaScript-фильтр по двум параметрам - PullRequest
0 голосов
/ 28 декабря 2018

const dates = [
{arrival_date:'2019-01-01',departure_date:'2019-01-07'},
{arrival_date:'2019-01-07',departure_date:'2019-01-09'},
{arrival_date:'2019-01-10',departure_date:'2019-01-20'}
];

let is_filter_by_arrival_date = true;
let is_filter_by_dept_date = true;

У меня есть массив с именем dates.Также у меня есть две логические переменные is_filter_by_arrival_date и is_filter_by_dept_date.

Также у меня есть еще четыре переменные.

let arrival_from = '';
let arrival_to = '';

let dept_from = '';
let dept_to = '';

Что мне нужно, так это если булева переменная is_filter_by_arrival_date равна true.Мне нужно отфильтровать мои даты , используя прибытие_от и прибытие_в так же, как для is_filter_by_dept_date .

Что я сделалдо сих пор это

let results = dates.filter(e => {if(is_filter_by_arrival_date){
    e.arrival_date <= arrival_to && e.arrival_date >= arrival_to
}})

Но я хочу фильтровать не только по is_filter_by_arrival_date.Мне нужны is_filter_by_arrival_date и is_filter_by_dept_date.

Как мне добиться этого с помощью JavaScript.

Ответы [ 5 ]

0 голосов
/ 29 декабря 2018

Просто используйте некоторую булеву алгебру.bypass || condition будет иметь значение true, если установлено bypass, в противном случае condition:

 const result = dates.filter(({ arrivalDate, departureDate }) => {

    const arrivalFits = arrivalDate <= arrivalTo && arrivalDate >= arrivalTo;
    const departureFits = departureDate <= departureTo && departureDate >= departureTo;

   return (!filterByArrival || arrivalFits) && (!filterByDeparture || departureFits);
});
0 голосов
/ 28 декабря 2018

Просто добавить другой фильтр?Также e.arrival_date <= arrival_to && e.arrival_date >= arrival_to совпадает с e.arrival_date === arrival_to, так как может совпадать только эта точная дата.Дата не может быть одновременно и> и <другой датой одновременно.Так что-то вроде этого может сработать: </p>

const dates = [
  {arrival_date:'2019-01-01',departure_date:'2019-01-07'},
  {arrival_date:'2019-01-07',departure_date:'2019-01-09'},
  {arrival_date:'2019-01-10',departure_date:'2019-01-20'}
];

let is_filter_by_arrival_date = true;
let is_filter_by_dept_date = true;

let arrival_from = null;
let arrival_to = '2019-01-01';

let dept_from = null;
let dept_to = '2019-01-07';

let results = dates.filter( timeslot => {
  if ( is_filter_by_arrival_date && is_filter_by_dept_date ) {
    return timeslot.arrival_date === arrival_to && timeslot.departure_date === dept_to;
  }
  else if ( is_filter_by_arrival_date ) {
    return timeslot.arrival_date === arrival_to; 
  }
  else if ( is_filter_by_dept_date ) {
    return timeslot.departure_date === dept_to;
  }
  else throw new Error( 'no valid filters selected' );
});

console.log( results );

Но я думаю, что у вас может быть ошибка в вашей логике.Если идея заключается в том, что пользователь может выбрать диапазон дат приезда и отъезда, следовательно, если бы у вас были оба параметраприбытие :_прибытие и прибытие_, то вам нужно сравнить e.arrival_date <= arrival_to && e.arrival_date >= arrival_from вместо того, чтобы сравнивать с прибытием_ оба раза.Если это правда, то код становится:

const dates = [
  {arrival_date:'2019-01-01',departure_date:'2019-01-07'},
  {arrival_date:'2019-01-07',departure_date:'2019-01-09'},
  {arrival_date:'2019-01-10',departure_date:'2019-01-20'}
];

let is_filter_by_arrival_date = true;
let is_filter_by_dept_date = true;

let arrival_from = '2018-12-30';
let arrival_to = '2019-01-03';

let dept_from = '2019-01-07';
let dept_to = '2019-01-15';

let results = dates.filter( timeslot => {
  if ( is_filter_by_arrival_date && is_filter_by_dept_date ) {
    return timeslot.arrival_date >= arrival_from && timeslot.arrival_date <= arrival_to && timeslot.departure_date >= dept_from && timeslot.departure_date <= dept_to;
  }
  else if ( is_filter_by_arrival_date ) {
    return timeslot.arrival_date >= arrival_from && timeslot.arrival_date <= arrival_to
  }
  else if ( is_filter_by_dept_date ) {
    return timeslot.departure_date >= dept_from && timeslot.departure_date <= dept_to
  }
  else throw new Error( 'no valid filters selected' );
});

console.log( results );

Фильтр может быть записан короче с троицами, как показывают другие решения.Но я предпочел написать его полностью с помощью операторов if / else, чтобы было более понятно, как работает фильтр.

0 голосов
/ 28 декабря 2018

Я не могу понять, чего вы хотите достичь, однако хочу отметить:

  1. В функции обратного вызова вы можете проверить состояние ваших значений.
  2. Вернуть значения.На данный момент вы ничего не возвращаете, и, вероятно, у вас есть массив с undefined значениями
0 голосов
/ 28 декабря 2018
let results = dates.filter(e => {
  if(is_filter_by_arrival_date && is_filter_by_dept_date){
    return ( e.arrival_date <= arrival_to && e.arrival_date >= arrival_from &&
             e.departure_date <= dept_to && e.departure_date > = dept_from);
  }
  else if(is_filter_by_arrival_date){
    return e.arrival_date <= arrival_to && e.arrival_date >= arrival_from
  } else if(is_filter_by_dept_date) {
    return e.departure_date <= dept_to && e.departure_date > = dept_from
  }
  return true;
})

Я думаю, что в вашем вопросе вы только что использовали прибытие_, вам также следует использовать прибытие_ от.Я реализовал в соответствии с моим пониманием.

Счастливое кодирование !!

0 голосов
/ 28 декабря 2018

Вы можете использовать троичный оператор, как показано ниже для кода уборщика

let results = dates.filter(e => {
  return (
    is_filter_by_arrival_date ? 
    // verify your condition for arrival date
    e.arrival_date <= arrival_to && e.arrival_date >= arrival_to 
    : 
    true
  ) && (
    is_filter_by_dept_date ? 
    // verify your condition for dept date
    : 
    true
  )
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...