Ответ 1
Я столкнулся с этой проблемой. Решение состоит в том, чтобы сохранить упорядоченный массив ключей в дополнение к исходному объекту.
var objects = {
"7": {"id":"7","name":"Hello"},
"3": {"id":"3","name":"World"},
...
}
var order = [ "3", "7", ... ];
Теперь, если вам нужен второй элемент, вы можете выполнить этот поиск:
var second_object = objects[order[1]];
В стандарте ECMA ничего не говорится о порядке элементов в объекте. И особенно Chrome переупорядочивает ключи, когда они выглядят как цифры. Пример:
var example = {
"a": "a",
"b": "b",
"1": "1",
"2": "2"
};
если вы напечатаете это в Chrome, вы получите что-то вроде:
{
1: "1",
2: "2",
"a": "a",
"b": "b"
};
Это немного кислый.. но жизнь.
Вы можете использовать решение Andy, связанное также, в основном обертывая эти два вместе в одном объекте.
Альтернативой, которую я использую много, является пользовательская функция карты, которая позволяет указать порядок, в котором перемещается объект. Как правило, вы будете сортировать, когда вы печатаете свои данные пользователю, поэтому, когда вы выполняете цикл и создаете свои строки таблицы (например), ваш итератор будет передавать строки в том порядке, который указан вашей функцией сортировки. Я подумал, что это хорошая идея:)
Подпись выглядит так:
function map(object, callback, sort_function);
Пример использования:
map(object, function (row) {
table.add_row(row.header, row.value);
}, function (key1, key2) {
return object[key1] - object[key2];
});