如何在javascript中处理同一函数中的数据的多种格式

时间:2016-08-29 17:56:00

标签: javascript google-maps geolocation

我有一个功能,需要2对纬度和经度,并以m为单位返回距离。

function distance(lat1, lon1, lat2, lon2){
      var p = Math.PI/180;
      var c = Math.cos;
      var a = 0.5 - c((lat2 - lat1) * p)/2 +
           c(lat1 * p) * c(lat2 * p) *
           (1 - c((lon2 - lon1) * p))/2;

       return 12742 * Math.asin(Math.sqrt(a)) * 1000; // 2 * R; R = 6371 km
    }//Distance

(注意我没有创建这个功能但是从SO上的另一个问题得到了它)

我有多个纬度和经度来源,我想知道如何处理它们。我尝试使用||这样的

var distanceFromTarget = distance(
      target.latitude || target.lat || target.lat(),
      target.longitude || target.lng || target.lng(),
      current.latitude || current.lat || current.lat(),
      current.longitude || current.lat || current.lng()
    );

我想使用该函数处理来自三种不同格式的输入

navigator.geolocation.x

格式返回数据
{latitude: 0000, longitude:0000}

返回

的插件
{lat: 000, lng: 000} 

和google maps api返回一个复杂的对象,其中包含lat和lng的getter的位置:

location = {lat(){return latitude}, lng(){return longitude}}

我怎样才能处理这三个?我以为我上面的东西在起作用,但现在我很清楚它不是。当位置的格式为target.lat()时,距离返回NaN。如果有人可以解释||一般如何工作也会很好,因为我认为如果前一个对象未​​定义,它将只使用下一个对象。

1 个答案:

答案 0 :(得分:0)

问题实际上是代码如何处理错误,例如原始当前对象或目标对象是否未定义。同样在位置对象包含latlng lat()或lng()的getter的情况下。然后定义target.lat,因此我使用了

function atPosition(current, target){
    if (typeof current === "undefined" || typeof target == "undefined") {
      console.log("current or target position undefined.")
      return
    }
    //if target is function and defined set property to return value of function.
    if (typeof target === "object" && typeof target.lat === "function") {
      target.lat = target.lat();
      target.lng = target.lng();
    }

    //console.log(target);
    //if currentPosition is within 25m of target return true
    var distanceFromTarget = distance(
      target.latitude || target.lat,
      target.longitude || target.lng,
      current.latitude || current.lat,
      current.longitude || current.lng
    );
    console.log("Distance from target", distanceFromTarget);
    if (distanceFromTarget <= 25) {
      return true
    } else {
      return false
    }
  }