2009-11-05 91 views
2

以javascript(按字母順序和數字順序)訂購集合有多容易/難。在javascript中訂購

說我有喜歡收藏:

var map = { 

    user: { id: "23434", username: "mrblah" }, 
    user: { id: "1010", username: "johnskeet" } 

}; 

而且我想通過ID和用戶名對集合。

更新 校正感謝:

var map = [ { id: "23434", username: "mrblah" }, { id: "1010", username: "johnskeet" } ]; 
+3

您的對象中不能有兩個名爲user的成員。也許你想要的是一個數組? 'var map = [{id:「23434」,username:「mrblah」},{id:「1010」,username:「johnskeet」}];' – artlung 2009-11-05 02:20:52

+0

你需要將JSON對象轉換爲數組,然後它的和平蛋糕 – Xinus 2009-11-05 02:30:18

+3

我們不要將JavaScript對象文字與JSON混淆。 – 2009-11-05 02:53:53

回答

3
var map = { 
    users: [ 
     { id: "23434", username: "mrblah" }, 
     { id: "1010", username: "johnskeet" } 
    ] 
}; 

map.users.sort(function(a, b) { 
    return a.id - b.id; 
}); 

map.users.sort(function(a, b) { 
    return a.username.localeCompare(b.username); 
}); 
+0

的JSON對象:map.users.sort = function(....)然後呢? – mrblah 2009-11-05 02:46:49

+0

你說的這個'compareTo'是什麼? – 2009-11-05 02:48:29

+0

固定,很好的捕獲。 – ChaosPandion 2009-11-05 02:51:50

-1

你希望你的對象是一個數組:

var map = [ 
    { id: "23434", username: "mrblah" }, 
    { id: "1010", username: "johnskeet" }, 
    { id: "1220", username: "alohaguy" } 
]; 

我們需要一個實用工具,以顯示該用戶名,所以我們可以測試我們的工作:

var displayUsernames = function(map) { 
    var out = []; 
    for (var i=0;i<map.length;i++) { 
     out.push((map[i].username)); 
    } 
    alert(out.join(', ')); 
}; 

如果我們使用它:displayUsernames(map);我們得到mrblah,johnskeet,alohaguy

因爲它是一個數組,所以我們可以使用.sort(),像這樣:map.sort();,但如果我們這樣做,我們仍然可以得到:

mrblah,johnskeet,alohaguy

...從displayUsernames(map);因爲對象的數組不能如此就像它是一組數字或字符串一樣。

然而,如果我們通過sort()功能的比較功能...

var myCompareFunction = function(a, b) { 
    return a.username.localeCompare(b.username); 
}; 

然後將它傳遞到map.sort()

map.sort(myCompareFunction); 

現在,當我們與displayUsernames(map);再次顯示我們得到alohaguy ,johnskeet,mrblah

希望有幫助。

+1

比較函數不應返回布爾值。 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort – ChaosPandion 2009-11-05 02:56:40

+0

@ChaosPandion - 謝謝,每天都在學點東西!我將它從'a.username> b.username'更改爲'a.username.localeCompare(b.username);' – artlung 2009-11-05 03:00:50

+0

我無法向您投票,您是否可以對答案進行某種修改? – ChaosPandion 2009-11-05 03:03:44