2009-11-05 2 views
2

Как легко/сложно заказать коллекции в javascript (в алфавитном порядке и численно).Заказ на javascript

Скажем, у меня есть коллекция, как:

var map = { 

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

}; 

И я хочу заказать коллекцию по идентификатору и имени пользователя.

Update коррекция благодаря:

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

У вас не может быть двух членов, названных пользователем в вашем объекте. Возможно, вам нужен массив? 'var map = [{id:" 23434 ", имя пользователя:" mrblah "}, {id:" 1010 ", имя пользователя:" johnskeet "}];' – artlung

+0

вам нужно преобразовать объект JSON в массив, а затем его покойный торт – Xinus

+3

Давайте не будем путать JavaScript-объекты с JSON. –

ответ

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

, если это так: map.users.sort = function (....), а затем? – mrblah

+0

Что это такое «compareTo' ты говоришь? –

+0

Исправлено, приятно поймать. – ChaosPandion

-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);, так как массив объектов не может быть так rted так же, как если бы это был массив чисел или строк.

Однако, если передать функции 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/ru/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort – ChaosPandion

+0

@ChaosPandion - спасибо, узнайте что-нибудь каждый день! Я изменил его с 'a.username> b.username' на' a.username.localeCompare (b.username); ' – artlung

+0

Я не могу проголосовать за вас, можете ли вы внести какую-то модификацию в свой ответ? – ChaosPandion

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