Angular заменяет двойную итерацию лямбда-выражением

Есть ли простой способ написать этот блок кода:

  this.markersDisplay = this.markersSource;

    // Filter Marker Type
    if (this.isValid(this.selectedMarkersType)) {
      let markers: Array<Marker> = new Array<Marker>();
      for (let marker of this.markersDisplay) {
        for (let markerType of this.selectedMarkersType) {
          if (marker.MarkerType == markerType) {
            markers.push(marker);
            break;
          }
        }
      }
      this.markersDisplay = markers;
    }

Я хотел бы заменить двойной для итерации некоторым лямбда-выражением

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
840
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы хотите использовать метод Array.forEach.

this.markersDisplay = this.markersSource;

// Filter Marker Type
if (this.isValid(this.selectedMarkersType)) {
  let markers: Array<Marker> = new Array<Marker>();
  this.markersDisplay.forEach(md => {
    this.selectedMarkersType.forEach(mt => {
      if (md.MarkerType === mt) {
        markers.push(md);
      }
    });
  });
  this.markersDisplay = markers;
}

Попробуй это:

markers = markersDisplay.filter(x=>{
    return selectedMarkersType.find((curVal,i)=>{
        return x.MarkerType==curVal;
    })
});

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

this.markersDisplay.forEach((p) => {
        p.MarkerType.filter(p => p.MarkerType === this.selectedMarkersType).map(p => markers.push(marker));
      });
Ответ принят как подходящий

Если вам не нужен оператор break, вы можете использовать это

markers = this.markersDisplay
    .filter((marker: Marker) => (this.selectedMarkersType
            .find((markerType: MarkerType) => markerType === marker.MarkerType)));

Если вы не работаете с типами:

markers = this.markersDisplay
    .filter(marker => (this.selectedMarkersType
            .find(markerType => markerType === marker.MarkerType)));

Если вам нужно использовать оператор break для повышения производительности, вы не можете использовать стрелочные функции. Вместо этого используйте некоторые() или все() функции:

markers = this.markersDisplay
    .filter(marker => (this.selectedMarkersType
            .some(markerType => markerType === marker.MarkerType)));

Вы видите, как это происходит в этом stackblitz

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