Javascript排序数组 - 在比较函数中调用函数

Posted

技术标签:

【中文标题】Javascript排序数组 - 在比较函数中调用函数【英文标题】:Javascript sort array - Calling a function inside compare function 【发布时间】:2019-04-30 18:24:52 【问题描述】:

我有一个对象数组,其中包含一些地址数据,包括纬度和经度。

我有一个函数可以计算两组纬度/经度坐标之间的距离。

我需要从一组特定的纬度/经度中从最近到最远对我的数组进行排序。

我正在尝试使用arr.sort(comparefunction),但到目前为止还没有运气。 是否可以在我的比较函数中使用外部函数来做到这一点?

这是我尝试过的代码。

function getDistance (lat1, lon1, lat2, lon2, unit) 
    var radlat1 = Math.PI * lat1/180
    var radlat2 = Math.PI * lat2/180
    var theta = lon1-lon2
    var radtheta = Math.PI * theta/180
    var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    if (dist > 1) 
        dist = 1;
    
    dist = Math.acos(dist)
    dist = dist * 180/Math.PI
    dist = dist * 60 * 1.1515
    if (unit=="K")  dist = dist * 1.609344 
    if (unit=="N")  dist = dist * 0.8684 
    return dist



let distributors = [
    
        city: "A",
        lat: 44.3384925,
        long: -59.6993207,
        name: "Name 1",
    ,
    
        city: "B",
        lat: 44.3384925,
        long: -78.6993207,
        name: "Name 2",
    ,
    
        city: "C",
        lat: 64.3384925,
        long: -39.6993207,
        name: "Name 3",
    
];

let sortedDist = distributors.sort(function(a, b) 

    if(getDistance(44.3617171302915, -79.65860486970848, a.lat, a.long, "K") < getDistance(44.3617171302915, -79.65860486970848, a.lat, a.long, "K"))
        return -1;
    
    if(getDistance(44.3617171302915, -79.65860486970848, a.lat, a.long, "K") > getDistance(44.3617171302915, -79.65860486970848, a.lat, a.long, "K"))
        return 1;
    
    return 0;
)


所以在这种情况下,数组中的第二个元素距离44.3617171302915, -79.65860486970848最近,但我console.log(sortedDist)并没有改变。

【问题讨论】:

你注意到getDistance() 的两个结果在同一个if 集合中是相同的吗?请注意,您始终使用a.lata.long,而从不使用b.latb.lang。所以排序比较方法总是返回0 如果您有 很多 个这些点(数百个或更多),您可能可以通过在列表上进行一次线性传递来计算每个点的距离来加速排序点并将其保存在每个对象上。这将导致对getDistance() 的调用数量显着减少。 【参考方案1】:

问题是您将aa 进行比较,请尝试:

let sortedDist = distributors.sort(function(a, b) 

    if(getDistance(44.3617171302915, -79.65860486970848, a.lat, a.long, "K") < getDistance(44.3617171302915, -79.65860486970848, b.lat, b.long, "K"))
        return -1;
    
    if(getDistance(44.3617171302915, -79.65860486970848, a.lat, a.long, "K") > getDistance(44.3617171302915, -79.65860486970848, b.lat, b.long, "K"))
        return 1;
    
    return 0;
)

或相同的语法更短:

let sortedDist = distributors.sort(function(a, b) 

    let aDist = getDistance(44.3617171302915, -79.65860486970848, a.lat, a.long, "K");
    let bDist = getDistance(44.3617171302915, -79.65860486970848, b.lat, b.long, "K");

    return aDist - bDist;
)

【讨论】:

您可以进一步缩短它:return aDist - bDist 我的错,我之前有错误的逻辑(当我修复了这个重复的问题时),然后当我编写正确的逻辑时,我又犯了同样的错误。谢谢

以上是关于Javascript排序数组 - 在比较函数中调用函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript sort()对数组中的元素进行排序

javascript中的数组排序——sort()方法

js 一/二维数组排序

JavaScript数组sort()方法小结

JavaScript 快速排序法

JS sort() 按照某个属性对数组进行排序