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

How to handle multiple formats for data in the same function in javascript

本文关键字:处理 数据 格式 函数 javascript 同一个      更新时间:2023-09-26

我有一个函数,它接受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

(注意我没有创建这个函数,但从另一个问题得到了它)

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

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} 

和谷歌地图API,它返回一个复杂的对象的位置包含getter为lat和LNG像这样:

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

我如何同时处理这三个问题?我认为我上面有工作,但现在我很清楚,它不是。当位置为target.lat()格式时,Distance返回NaN。如果有人能解释||是如何工作的,那就太好了,因为我认为如果前一个对象未定义,它只会使用下一个对象。

真正的问题在于代码如何处理错误,比如如果原始的当前对象或目标对象未定义。同样在位置对象包含latlng lat()或lng()的getter的情况下。然后目标。因此我使用

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