2013-06-06 62 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

這可能是你沒有初始化do-while循環開始時,您已交換變量。嘗試用'var swapped = false'替換'var swapped' – mfaerevaag

+0

使用本機'sort'會更快http://stackoverflow.com/a/1129270/1346222 – nk9

回答

4

唯一的問題是您沒有正確使用「par」參數。 obj.prop語法將總是嘗試查找名爲「prop」的屬性,以便使其具有動態性,您需要使用方括號obj [「道具」],它可以變量而不是「道具」。

您沒有得到任何錯誤,因爲a[i].para[i+1].par都返回undefined哪些可以比較自己。 (因此a[i].par > a[i+1].par始終返回false)

下面是修改後的作品代碼:

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沒有「通過引用」函數arguments_)? 'a'肯定是通過引用傳入'bubbleSort'的,或者你認爲它被複制了,並且其副本被傳遞到'bubbleSort'中?在'bubbleSort'內就地排列數組一定會起作用。 –

+0

@AlexanderPavlov金髮時刻/無知對我來說你完全正確。我修改了我的答案。謝謝! :) –

+0

np。否則很好的答案! –

2

使用內置的數組排序功能:

arrayOfPeople.sort(function(a,b) {return a.age-b.age;});