Подтвердить что ты не робот

Как сохранить упорядоченный объект/массив Javascript, сохраняя также ключевые поисковые запросы?

У меня есть некоторые данные, которые я первоначально сохранил в общем объекте Javascript, с идентификатором в качестве ключа:

{
  "7": {"id":"7","name":"Hello"},
  "3": {"id":"3","name":"World"},
  ...
}

Однако я обнаружил, что браузеры не гарантируют определенный порядок объектов при прохождении через них, поэтому в вышеприведенном "3" появится до "7". Я переключился на использование формата массива следующим образом:

[
  {"id":"7","name":"Hello"},
  {"id":"3","name":"World"},
  ...
]

Теперь я могу выполнить цикл в правильном порядке, но не могу выполнять быстрый поиск, например. data["3"] без необходимости перебирать массив.

Есть ли хороший способ объединить оба подхода? Я бы предпочел не использовать отдельный объект для каждого формата, потому что объект довольно большой (сотни элементов).

4b9b3361

Ответ 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];
});