我正在尝试根据与用户位置的接近程度使用地理点对淘汰赛可观察数组进行排序。我有一个函数可以遍历我的数组中的所有商店并找到离用户当前位置最近的标记。然后我将它嵌套在另一个循环中,使用插入排序对所有元素进行排序。
我有两个问题。第一的。我的交换方法有点时髦。我认为它打破了 dom。不要以为我理解如何在淘汰赛可观察到的情况下正确交换元素。
第二。这甚至是正确的方法吗?Ko 可观察数组有一个内置的排序方法,但我不确定如何使用最接近用户函数的点来实现它。我附上了下面的代码。任何帮助或见解将不胜感激。
var stores = ko.observableArray();
storesRepository.getFeed(stores);
function closestMarker(lat, lng)
{
var pi = Math.PI;
var R = 6371; //equatorial radius
var lat1 = lat;
var lon1 = lng;
var distances, closest, min, chLat, chLon, dLat, dLon, rLat1, rLat2, a, c, d;
for (j = 0; j < stores().length; j++) { // outer loop uses insertion sort to "sort" elements.
distances = [];
closest = -1;
min = 0;
for (i = j+1; i < stores().length; i++) { // inner loop finds closest marker to user
var lat2 = stores()[i].latitude();
var lon2 = stores()[i].longitude();
chLat = lat2 - lat1;
chLon = lon2 - lon1;
dLat = chLat * (pi / 180);
dLon = chLon * (pi / 180);
rLat1 = lat1 * (pi / 180);
rLat2 = lat2 * (pi / 180);
a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(rLat1) * Math.cos(rLat2);
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
d = R * c;
distances[i] = d;
if (closest == -1 || d < distances[closest]) {
closest = i;
}
}
swap(j, closest);
}
function swap(a, b) { // i dont think this is the right approach
// alert("working");
var temp = stores()[b];
stores.replace(stores()[b],stores()[a]);
stores.replace(stores()[a], temp);
}
}
return stores;