用lambda表达式替换双迭代

时间:2019-01-30 11:51:25

标签: angular typescript

是否有一些简单的方法可以编写以下代码块:

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

我想用一些lambda表达式替换 double迭代

4 个答案:

答案 0 :(得分:1)

尝试一下:

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

答案 1 :(得分:1)

我对您的数据结构做了一些假设,但是我希望下面的代码对您有用。

this.markersDisplay.forEach((p) => {
        p.MarkerType.filter(p => p.MarkerType === this.selectedMarkersType).map(p => markers.push(marker));
      });

答案 2 :(得分:1)

如果您不需要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语句来提高性能,则不能使用箭头功能。而是使用some() or every() functions

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

您可以看到这种情况in this stackblitz

答案 3 :(得分:0)

您要使用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;
}