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.lat
和a.long
,而从不使用b.lat
或b.lang
。所以排序比较方法总是返回0
。
如果您有 很多 个这些点(数百个或更多),您可能可以通过在列表上进行一次线性传递来计算每个点的距离来加速排序点并将其保存在每个对象上。这将导致对getDistance()
的调用数量显着减少。
【参考方案1】:
问题是您将a
与a
进行比较,请尝试:
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排序数组 - 在比较函数中调用函数的主要内容,如果未能解决你的问题,请参考以下文章