2014-11-04 2 views
1

Проблема с массивом сортировки объектов в Javascript. Сортировка массива объектов, которые имеют lat, lng и пытается сортировать по расстоянию от определенной точки. Объект выглядит следующим образом (не полный объект, но вы получите идею)Проблема сортировки массива Javascript

0: Object 
lat: 27.267653 
lng: -81.351229 
price: 214.29 
title: "Lake Front Home" 

Сортировка с помощью:

set.sort(sortDistanceLow); 

var sortDistanceLow = function(a,b) 
{ 
    var aDist = geoLib.distance(a.lat,a.lng, sortOrigin.lat,sortOrigin.lng); 
    var bDist = geoLib.distance(b.lat,b.lng, sortOrigin.lat,sortOrigin.lng); 
    return (aDist-bDist); 
} 

Результат сортировки имеет 2 пунктов из строя и для жизни меня I не может понять, почему. Посмотрите на индекс 0 и 21:

Dist for - 0 Lake Front Home is - 1.8974297528647823 
Dist for - 1 Waterfront Property for Rent is - 0 
Dist for - 2 The Terrace On Lake McCoy 310 is - 0.6564731929026136 
Dist for - 3 The Terraces on Lake McCoy 309 is - 0.6606015018504228 
Dist for - 4 A+ Reviews, Lakefront Townhome w/pool, n is - 0.9397875614447686 
Dist for - 5 A Brand New Luxurious Lakefront Townhous is - 1.004205821447096 
Dist for - 6 Simplicity Cottage Lakeside Bungalow is - 1.0611283822559001 
Dist for - 7 Spend Some Time In A Quiet Secluded Spot is - 1.073466614941598 
Dist for - 8 Dockside Apartment is - 1.073466614941598 
Dist for - 9 Field of Dreams Lakefront Paradise is - 1.1013500555209488 
Dist for - 10 Beautiful Lake June Home is - 1.1499388283994212 
Dist for - 11 Beautiful Lake June Home is - 1.2739374435782866 
Dist for - 12 Lakefront Condo on Lake Clay is - 1.3737081520111232 
Dist for - 13 Spacious Lake Front Home on Lake June ~ is - 1.378625813859494 
Dist for - 14 Lake Front Retreat, Lake Placid FL-Water is - 1.3858006411581065 
Dist for - 15 Tranquil Retreat, Boating, Fishing, Away is - 1.4176726711713614 
Dist for - 16 Sunsets on Lake June - Immaculate and Up is - 1.47195380295702 
Dist for - 17 5 bedroom Peaceful Lakeside Retreat is - 1.4900487697270766 
Dist for - 18 Dales lakeside Resort Waterfront Renta is - 1.743581215913245 
Dist for - 19 Lakefront Home on Beautiful Lake Placid is - 1.853756967222272 
Dist for - 20 2/1 Lake Cottage with lake frontage is - 1.867513852723976 
Dist for - 21 Lakefront Home with 90 Feet of Beach on is - 0.16723017662153244 
Dist for - 22 12 hours of Sebring 2015 Now available. is - 2.2415279722624306 
Dist for - 23 12 HOURS OF SEBRING 2015 Lodging, POOL is - 2.341305343714389 
Dist for - 24 Paradise on Lake Henry is - 2.350980389549641 
Dist for - 25 RACEWEEK OPEN FOR MARCH14TH-20TH. BOOK I is - 2.4024846058745863 
Dist for - 26 Rest and Relax at this Lake June Canal H is - 2.4137136067655165 
Dist for - 27 Vacation Home on Beautiful Lake June is - 2.855113621669036 
Dist for - 28 Spacious Lakefront Home Suited for Famil is - 3.0899549570788807 
Dist for - 29 Lake Front Units on 3500 Acre Lake with is - 3.1968086279685175 
Dist for - 30 Spacious 2/1 Lake front on Lake Francis is - 3.853031623209993 
Dist for - 31 Luxury Condo on Lake June in Lake Placid is - 4.063322037811134 
Dist for - 32 On Beautiful Lake Francis is - 4.272605400889185 
Dist for - 33 Lakehouse on Lake Francis is - 4.3022024460943 
Dist for - 34 Steven and Louise Feller is - 4.403574090711126 
Dist for - 35 Beautiful Lakehouse on Lake Francis is - 4.423557301583266 
Dist for - 36 Lake Placid Lakefront is - 4.487153454616658 
Dist for - 37 On Beautiful Lake Francis is - 4.514940849305256 
Dist for - 38 Lakefront on Lake Francis is - 4.514952029669339 
Dist for - 39 Lake Francis Home is - 4.580087323715115 
Dist for - 40 Lake Francis Estate is - 4.60022361563561 
Dist for - 41 Visit Paradise at 'sunshine rv resort' is - 7.051312339930277 
+0

Is distance in 'Dist for - 0 Lake Front Home is - 1.8974297528647823' рассчитано с той же формулой, что и в сортировке fn' geoLib.distance (a.lat, a.lng, sortOrigin.lat, sortOrigin.lng) '? – Heikki

+1

Похоже, что это может быть переменная проблема подъема как @DanielAllenLangdon. Механизм js будет читать ваш код как: 'var sortDistanceLow = undefined; set.sort (sortDistanceLow); sortDistanceLow = function() {...} ', который заставит его использовать сортировщик по умолчанию ... –

+0

Хейкки - ДА. используя такой же функция. Я console.debugged функцию сортировки и получаю то же значение – Belka

ответ

1

Если вы объявляете функцию сортировки с функцией заявления, он может появиться в любом месте есть замыкание, где он используется. Если вы объявляете функцию сортировки с помощью оператора var, она должна предшествовать тому, где она используется. (. Дуглас Крокфорд рекомендует, чтобы функция декларация всегда должна быть на первом месте по соглашению, но это другое обсуждение)

Попробуйте это:

set.sort(sortDistanceLow); 

function sortDistanceLow(a,b) { // instead of var sortDistanceLow = function(a,b) 
    var aDist = geoLib.distance(a.lat,a.lng, sortOrigin.lat,sortOrigin.lng); 
    var bDist = geoLib.distance(b.lat,b.lng, sortOrigin.lat,sortOrigin.lng); 
    return (aDist-bDist); 
} 

Если это не сработает, я хотел бы предложить вам проверить свои библиотека с соответствующими точками; ваш пример выглядит просто, и если вы получаете неправильный результат, я бы протестировал библиотеку.

Обновление в ответ на комментарий OP: Я бы сказал, что если вы протестировали код как в Firefox, так и в Chrome, и он работает в одном, но не в другом, выполните следующие действия.

(1) Сделайте копию вашей веб-страницы, у которой есть эта проблема, и вытащите все с веб-страницы, которая не имеет отношения к ошибке. Затем уменьшите веб-страницу до абсолютной простейшей вещи, которую вы можете сделать, чтобы воспроизвести проблему. Можете ли вы получить неправильное поведение сортировки с массивом из двух элементов?

(2) После того как вы сделали (1), внимательно просмотрите упрощенную веб-страницу. Если вы все еще не видите, что вызывает проблему, отправьте новый вопрос в StackOverflow, в котором показан код всей страницы (что должно быть очень коротко!) И объяснить ожидаемое поведение и фактическое поведение.

(3) Если вы сделали (2) и не можете получить объяснение несоответствия, подумайте о том, как сообщить об этом как о возможной ошибке Chrome. По моему опыту, если веб-страница ведет себя по-разному в Chrome и Firefox, она, как правило, связана с тем, что на странице что-то не так. Различные браузеры ведут себя по-разному, когда сталкиваются с недействительными HTML/CSS/JS.

+0

Спасибо за ваш ответ. Я вхожу в функцию сортировки, и она сортирует, это всего лишь два члена массива. Библиотека (я предполагаю, что вы имеете в виду гео-библиотеку.Я нахожусь в рабочем состоянии, поэтому не могу использовать google lib) выглядит так, как будто он работает нормально, по крайней мере, расстояния рассчитаны правильно, это сортировка, которая сводит меня с ума :)) – Belka

+0

Если вы пробовали другие вещи, попробовал, а затем протестировал тестовый тест вашей функции сортировки с элементами, которые выглядят неуместными. –

+0

Все работает отлично на Firefox! Ошибка Chrome? Running chrome 38.0.2125.111 – Belka

Смежные вопросы