2009-11-05 55 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