2013-06-06 4 views
1

начинающий здесь!Javascript пузырь вид массива с объектами

Недавно наткнулся на проблему. В принципе, программе необходимо отсортировать массив объектов одним из своих полей, не используя функцию сортировки. Я попробовал этот код, используя алгоритм пузырьковой сортировки, но не кажется, что это будет работать:

var arrayOfPeople = [ 
    {name: "Rick", age: 30, place: 2}, 
    {name: "Alan", age: 25, place: 1}, 
    {name: "Joe", age: 40, place: 4}, 
    {name: "Dave", age: 35, place: 3} 
]; 


function bubbleSort(a,par) 
{ 
    var swapped; 

    do { 
     swapped = false; 

     for (var i = 0; i < a.length - 1; i++) { 
      if (a[i].par > a[i + 1].par) { 
       var temp = a[i]; 

       a[i] = a[i + 1]; 
       a[i + 1] = temp; 

       swapped = true; 
      } 
     } 
    } while (swapped); 
} 


bubbleSort(arrayOfPeople,'age'); 

for (i = 0; i < arrayOfPeople.length; i++) { 
    console.log(arrayOfPeople[i]); 
} 

Я думаю, что я делаю что-то неправильно синтаксис мудрым. Поймите любую обратную связь.

+0

Это может быть, что вы не инициализируется вы 'swapped'-variable для цикла do-while. Попробуйте заменить 'var swapped' на' var swapped = false' – mfaerevaag

+0

Использовать собственный 'sort' будет быстрее http://stackoverflow.com/a/1129270/1346222 – nk9

ответ

4

Проблема только в том, что вы не использовали аргумент «par» правильно. Синтаксис obj.prop всегда будет искать свойство с именем «prop», поэтому для его динамического использования вам необходимо использовать квадратные скобки, например. obj ["prop"], который может получить переменную вместо "prop".

Вы не получили каких-либо ошибок, как a[i].par и a[i+1].par оба вернулись неопределенную, который можно сравнить с самим собой. (Следовательно a[i].par > a[i+1].par всегда возвращает ложь)

Здесь пересмотренный код, который работает:

function bubbleSort(a, par) 
{ 
    var swapped; 
    do { 
     swapped = false; 
     for (var i = 0; i < a.length - 1; i++) { 
      if (a[i][par] > a[i + 1][par]) { 
       var temp = a[i]; 
       a[i] = a[i + 1]; 
       a[i + 1] = temp; 
       swapped = true; 
      } 
     } 
    } while (swapped); 
} 


bubbleSort(arrayOfPeople, 'age'); 

for (i = 0; i < arrayOfPeople.length; i++) { 
    console.log(arrayOfPeople[i]); 
} 

Live test case.

Стоит упомянуть в этом контексте, что функция, изменяющая фактический объект (массив в этом случае), не является тривиальной вещью. Чтобы узнать больше, что передается по значению, и то, что передается по ссылке, посмотрите на эту прекрасную вопрос: Is JavaScript a pass-by-reference or pass-by-value language?

+2

Можете ли вы прояснить свой первый оператор (_JavaScript не имеет« по ссылке », для аргументов функции)? 'a' определенно передается в' bubbleSort' по ссылке, или вы думаете, что он скопирован, а его копия передается в 'bubbleSort' вместо? Сортировка массива на месте внутри 'bubbleSort' определенно будет работать. –

+0

@ АлександрПавлов светлый момент/невежество с моей стороны, вы совершенно правы. Я пересмотрел свой ответ. Благодаря! :) –

+0

np. Отличный ответ в противном случае! –

2

Используйте встроенную функцию массива сортировки:

arrayOfPeople.sort(function(a,b) {return a.age-b.age;}); 
Смежные вопросы