Правильный способ вернуть true / false в логическом методе TypeScript / JavaScript?

Я пытаюсь отключить все даты, когда у пользователя уже есть забронированное мероприятие. Я использую https://www.npmjs.com/package/ng-pick-datetime TypeScript и Angular 6. Мне удобнее работать с Java, но я изучаю немного Javascript самостоятельно.

.TS

    getUserEvents() {
    this._calendarService.getAllEvent().subscribe(res => {
      this.allEvents = res.json();
    });
  }

  filterForbiddenDays() {
    this.allEvents.forEach(d => {
      let day = {
        'start': new Date(d.startDate.value),
        'end': new Date(d.endDate.value)
      };
      this.forbiddenDays.push(day);
    });
  }

  public myFilter = (d: Date): boolean => {
    //return this.forbiddenDays[0].start.getDate() !== d.getDate() && this.forbiddenDays[1].start.getDate() !== d.getDate() // <-- THIS WORKS GREAT
    this.forbiddenDays.filter(data => {
      return data.start.getDate() !== d.getDate() // <-- TRUE SHOULD CHANGE COLOR ON DAY IN CALENDAR
    });
    return false;
  }

Если я сопоставлю массив disabledDays вместо forEach, я могу увидеть, что я получаю истинное значение для каждого события в bandedDays, которое должно изменить цвет в эти дни в календаре.

Но прямо сейчас метод myFilter приводит к следующему: картинка календаря

Что я делаю неправильно? Я чувствую, что проблема в методе myFilter.

.HTML

    <div class = "example-wrapper datePicker">
        <label class = "example-input-wrapper" id = "eventInputSuccess">
            <input (click) = "filterForbiddenDays()" id = "eventInputError" placeholder = "Click to choose date"
                (dateTimeInput) = "basic.openModal()" [(ngModel)] = "dateTimeInput" [owlDateTimeTrigger] = "dt"
                [owlDateTimeFilter] = "myFilter" [owlDateTime] = "dt"><i class = "fa fa-calendar" aria-hidden = "true"></i>
            <owl-date-time #dt [pickerMode] = "'dialog'"></owl-date-time>
        </label>
    </div>
</div>

Заранее спасибо!

Обновлено:

return this.forbiddenDays[0].start.getDate() !== d.getDate();

результаты в: ожидаемый результат, но для всех дней в моем массиве

Так что в основном он отлично работает, когда я указываю индекс, например [0] или [3] и т. д., Но я не уверен, почему он не работает с forEach () или filter ()

Посмотрите на функцию reduce.

Heretic Monkey 10.01.2019 00:02

У меня проблемы с пониманием процесса, что должен делать myFilter? он должен возвращать логическое значение?

Guy who types fast 10.01.2019 00:09

параметр d: Date возвращает все даты во всем календаре, и когда d равно дате в массиве запрещено, он должен возвращать логическое значение со значением true и отключать эту дату в календаре.

KENUBBE 10.01.2019 00:12

Я отредактировал пост

KENUBBE 10.01.2019 00:17

Так что в основном он отлично работает, когда я указываю индекс, например [0] или [1] и т. д., Но я не уверен, почему он не работает с forEach () или filter ()

KENUBBE 10.01.2019 00:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
8 503
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша функция myFilter всегда возвращает false.

return внутри this.forbiddenDays.forEach() только выходит из текущей итерации, но не приводит к остановке вашей функции. Вместо этого вы должны использовать some или every:

public myFilter = (d: Date): boolean => {
    return this.forbiddenDays.every(data => {
        return data.start.getDate() !== d.getDate() // <-- TRUE SHOULD CHANGE COLOR ON DAY IN CALENDAR
    });
}

это вернет true, только если все элементы в массиве соответствуют data.start.getDate() !== d.getDate() и false в противном случае.

Возврат значения из forEach не прерывает цикл.

Heretic Monkey 10.01.2019 00:25

Я не говорил, что это так. Я сказал, что это прерывает итерацию, а не цикл.

Guy who types fast 10.01.2019 00:26

И я говорю, что это ничего не ломает. Возвращаемое значение никуда не денется.

Heretic Monkey 10.01.2019 00:28

@HereticMonkey Вы знакомы с принципом работы .every()?

jhpratt 10.01.2019 00:28

Конечно, но мы обсуждаем forEach. @jhpratt

Heretic Monkey 10.01.2019 00:30

Да, возвращаемое значение внутри forEach никуда не денется, но все равно прерывает текущую итерацию.

Guy who types fast 10.01.2019 00:30

Выполните следующее: [1,2,3].forEach(i => { console.info(i); return false; }). Вы увидите 1 2 3, потому что итерация продолжается.

Heretic Monkey 10.01.2019 00:35

Я вижу, вы путаете итерацию и цикл. Запускаем [1,2,3].forEach(i => { console.info(i); return false; console.info('this is never print');});

Guy who types fast 10.01.2019 00:37

Ты прав. Я перепутал эти два ... что заставляет думать, что, возможно, ваш ответ мог бы быть более ясным: P

Heretic Monkey 10.01.2019 00:50

@Guywhotypesfast, который сделал свое дело! Также приветствую отличное объяснение :)

KENUBBE 10.01.2019 02:34

Ваша функция myFilter всегда возвращает false. Возврат в обратном вызове forEach или filter - нет будет возвращать функцию myFilter. Он просто возвращает переданный вами обратный вызов, что в данном случае бессмысленно.

Я думаю, вам нужно что-то вроде этого:

public myFilter = (d: Date): boolean => {
  return this.forbiddenDays.every(forbiddenDay => {
    return forbiddenDay.start.getDate() !== d.getDate();
  });
}

Метод array.every() возвращает false, если обратный вызов возвращает false для любого из элементов массива.

Вы также можете написать это с помощью цикла for..of:

public myFilter = (d: Date): boolean => {
  for (let forbiddenDay of this.forbiddenDays) {
    if (forbiddenDay.start.getDate() !== d.getDate()) {
      return true;
    }
  }
  return false;
}

Другие вопросы по теме