How to sort an array in JavaScript in a customized order?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
How to sort an array of javascript objects?
号
好吧,更确切地说,我有以下课程:
1 2 3 4 5 | function Location(name, latitude, longitude){ this.latitude = latitude; this.longitude = longitude; this.name = name; } |
我想按照接近给定位置的顺序对这些对象的数组进行排序(类似于这个类的对象)。
您需要一个比较器函数:
1 2 3 4 5 6 7 8 9 10 | 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); }); } |
号
我不必费心那里的平方根,因为我认为这是不必要的。另外,我不考虑球面几何的任何奇怪之处,因为我再次认为它不值得如此复杂。但是,如果您有自己的计算距离的方法,可以插入它,而不是我在上面键入的方法。
您只需将数组和参考点坐标传递给该函数就可以调用它。如果您想传递一个"位置"实例,那么应该清楚地知道要更改什么。
请参见:对javascript对象数组进行排序
另一个答案是简单的lat1-lat2+lon1-lon2公式,对于一个数学二维平面来说是不正确的,对于椭球体地球更是如此。除非距离确实不需要精确,否则应该使用Haversine公式作为排序函数。
发件人:http://www.movable-type.co.uk/scripts/latlong.html
1 2 3 4 5 6 7 8 9 10 | 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; |
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 ); }); }; |
首先,您有一个静态函数
第二,您有一个
用途:
1 2 | baseLocation.sortByProximity( locArr ); // locArr is now sorted in regard to baseLocation |
。
现场演示:http://jsfiddle.net/hgp66/
1 2 3 4 5 6 7 8 9 | 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 ; }); |
。
您需要将您的位置存储在一个数组中。
您想将一个函数传递给
1 2 3 4 5 6 7 8 9 10 11 | 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; } }); |