Typescript将此绑定到数组排序

时间:2017-01-16 05:46:04

标签: javascript sorting angular typescript

我正在将一个有效的JS解决方案重新实现为Typescript。 我有一组对象,它们具有纬度和经度的地理位置。

我想按照他们与某个特定位置currentLocation的距离对其进行排序。

我想将currentLocation存储为私有属性,并在sort函数中访问它。但是,在执行this.currentLocation时,这在compare中仍未定义。我试过了compare.bind(this),但没有成功。 this is not defined

任何想法如何解决这个问题?我用JS在全局变量中解决了它,但这并不优雅。 sortByDistance是一种对象方法。

 sortByDistance() {

      this.currentPosition = Leaflet.latLng(this._currentLatLng[0], this._currentLatLng[1]);

      function compare(a, b) {
        let p1 = Leaflet.latLng(a.lat, a.lng);
        let p2 = Leaflet.latLng(b.lat, b.lng);

        if (p1.distanceTo(this.currentPosition) < p2.distanceTo(this.currentPosition))
          return -1;
        else if (p1.distanceTo(this.currentPosition) > p2.distanceTo(this.currentPosition))
          return 1;
        return 0;
      }
      compare.bind(this);
      this.sorted = this.objects.sort(compare);

  }

3 个答案:

答案 0 :(得分:3)

您可以更改

 function compare(a, b) {
        let p1 = Leaflet.latLng(a.lat, a.lng);
        let p2 = Leaflet.latLng(b.lat, b.lng);

        if (p1.distanceTo(this.currentPosition) < p2.distanceTo(this.currentPosition))
          return -1;
        else if (p1.distanceTo(this.currentPosition) > p2.distanceTo(this.currentPosition))
          return 1;
        return 0;
      }

compare = (a, b)=>{
   let p1 = Leaflet.latLng(a.lat, a.lng);
   let p2 = Leaflet.latLng(b.lat, b.lng);

   if (p1.distanceTo(this.currentPosition) < p2.distanceTo(this.currentPosition))
      return -1;
   else if (p1.distanceTo(this.currentPosition) > p2.distanceTo(this.currentPosition))
      return 1;
   return 0;
}

以便this处于词汇范围

答案 1 :(得分:3)

return this.$refs返回一个新函数。试试compare.bind(this)

答案 2 :(得分:1)

bind的工作方式略有不同:

const boundCompare = compare.bind(this);
this.sorted = this.objects.sort(boundCompare);