Фильтровать массив с помощью forEach - PullRequest
1 голос
/ 07 марта 2019

У меня есть массив дат, где я хочу отфильтровать определенные дни.Это мое предыдущее решение, которое отлично работает:

var available = dates.filter(function(e) {
  return (
    e.getDay() != 0 && // sunday
    e.getDay() != 6 && // saturday
    e.getDay() != 2 && // tuesday
    e.getDay() != 3 && // wednesday
  );
});

Теперь я хочу сделать это динамичным.Итак, я получил массив, подобный этому:

var unavailable = [0, 2, 3, 6]

И затем я пытаюсь отфильтровать те дни, как это:

unavailable.forEach(function(x){
  available = dates.filter(function(e, index){
    return e.getDay() != x;
  });
});

Это не похоже на работу, хотя.Что я сделал не так и как я могу заставить это работать?Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 07 марта 2019

Нет необходимости использовать forEach использовать filter и includes

var unavailable = [0, 2, 3, 6]
var dates = ['1-1-2019', '1-2-2019', '1-3-2019', '1-4-2019',' 1-5-2019', '1-6-2019', '1-7-2019', '1-8-2019',' 1-9-2019'];
workingDays = dates.filter(e => {
return !unavailable.includes(new Date(e).getDate())})
console.log(workingDays)
1 голос
/ 07 марта 2019

Вам необходимо выполнить порядок сравнения и вернуть результат проверки.В этом случае вам нужно Array#every вместо Array#forEach, потому что вам нужен результат для фильтрации.

available = dates.filter(function(e, index) {
    return unavailable.every(function(x) {
        return e.getDay() != x;
    });
});

То же самое с Array#some и отрицание возвращенного результата и отрицательное сравнение.

available = dates.filter(function(e, index) {
    return !unavailable.some(function(x) {
        return e.getDay() === x;
    });
});

Более короткий подход.

var unavailable = [0, 2, 3, 6]
    available = dates.filter(e => !unavailable.includes(e.getDay()));
0 голосов
/ 07 марта 2019

Если вы не обладаете жесткостью для создания массива и не собираетесь использоваться где-либо еще в вашем коде, тогда нет необходимости.

dates.filter(e => e.getDay().toString().match(/0|6|2|3/));
0 голосов
/ 07 марта 2019

Вы можете попробовать следующее:

available = dates.filter(function(e) {
  return unavailable.indexOf(e.getDay()) === -1 ? true : false;
})

Проблема с вашим кодом заключается в том, что forEach перезаписывает значение, доступное на каждой итерации, и ваша программа добавляет трудности для понимания.

0 голосов
/ 07 марта 2019

Я получил правильный ответ для вас.

let unavailable = [0, 2, 3, 6];
available = dates.filter(e => !unavailable.includes(e.getDay());

Проблема с вашим кодом заключается в том, что для каждого элемента в недоступном массиве вы сбрасываете доступно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...