Javascript sort array - Вызов функции внутри функции сравнения. - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть массив объектов, которые содержат некоторые адресные данные, включая широту и долготу.

У меня есть функция, которая вычисляет расстояние между двумя наборами координат широты и долготы.

Мне нужно отсортировать мой массив от ближайшего к дальнему из определенного набора широт / длин.

Я пытаюсь использовать 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) и ничего не изменилось.

1 Ответ

3 голосов
/ 30 апреля 2019

Проблема в том, что вы сравниваете 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;
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...