1

重複の可能性:
javascript オブジェクトの配列をソートする方法は?

より正確には、次のクラスがあります。

function Location(name, latitude, longitude){
this.latitude = latitude;
this.longitude = longitude;
this.name = name;
}

そして、これらのオブジェクトの配列を、特定の Location (このようなクラスのオブジェクト) に近い順に並べ替えたいと考えています。

4

5 に答える 5

7

コンパレータ関数が必要です:

function sortLocations(locations, lat, lng) {
  function dist(l) {
    return (l.latitude - lat) * (l.latitude - lat) +
      (l.longitude - lng) * (l.longitude - lng);
  }

  locations.sort(function(l1, l2) {
    return dist(l1) - dist(l2);
  });
}

平方根は必要ないと思うので気にしません。また、球面ジオメトリの奇妙さについては説明していません。これもまた、複雑にする価値があるとは思わないためです。ただし、距離を計算する独自の既存の方法がある場合は、上記で入力した方法の代わりにプラグインすることができます。

配列と参照点の座標をその関数に渡すだけで、それを呼び出すことができます。代わりに「Location」インスタンスを渡したい場合は、何を変更するかを明確にする必要があります。

于 2012-06-05T23:29:29.463 に答える
4

参照: JavaScript オブジェクトの配列のソート

もう 1 つの答えの単純な lat1-lat2 + lon1-lon2 式は、数学的な 2 次元平面でさえ正しくありません。楕円体の地球ではなおさらです。距離が正確である必要がない場合を除き、ソート関数としてhasersine 式を使用する必要があります。

から: http://www.movable-type.co.uk/scripts/latlong.html

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;
于 2012-06-05T23:29:53.753 に答える
1
function Location(name, latitude, longitude){
this.latitude = latitude;
this.longitude = longitude;
this.name = name;
};

this.locations.push(new Location());

 this.locations.sort(function (a, b) { return a.latitude - b.latitude ; });

あなたはあなたの場所を配列に保存する必要があります。

于 2012-06-05T23:31:12.180 に答える
1

に関数を渡したいとしArray.prototype.sortます。このリンクには、かなり良い説明があります。これが球面ジオメトリには適していないことは承知していますが、次のようなものが必要になるでしょう。

var home = new Location("Home", 40, -50);
arr.sort(function(a, b){
    var dist1 = Math.sqrt(Math.pow(home.latitude-a.latitude, 2) + Math.pow(home.longitude-a.longitude, 2)),
        dist2 = Math.sqrt(Math.pow(home.latitude-b.latitude, 2) + Math.pow(home.longitude-b.longitude, 2));
    if (dist1 < dist2) { 
        return -1;
    }
    else {
        return 1;
    }
});
于 2012-06-05T23:28:09.113 に答える
1
Location.distance = function ( loc1, loc2 ) {
    return Math.sqrt(
        Math.pow( loc2.longitude - loc1.longitude, 2 ) +
        Math.pow( loc2.latitude - loc1.latitude, 2 )
    );
};

Location.prototype.sortByProximity = function ( arr ) {
    var that = this;
    arr.sort(function ( a, b ) {
        return Location.distance( that, a ) - Location.distance( that, b );
    });
};

まず、Location.distance2 つのインスタンスを取りLocation、それらの相対距離を表す値を返す静的関数があります。

第 2 に、インスタンスsortByProximityのメソッドとして呼び出され、最初の引数としてインスタンスLocationの配列を期待するメソッドがあります。Location

使用法:

baseLocation.sortByProximity( locArr );
// locArr is now sorted in regard to baseLocation

ライブデモ: http://jsfiddle.net/hGp66/

于 2012-06-05T23:40:01.660 に答える