Скажем, у меня есть ассоциативный массив Javascript (он же хеш, он же словарь):
var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;
Как я могу перебирать ключи в отсортированном порядке? Если это помогает упростить вещи, мне даже не нужны значения (все они просто цифра 1).
javascript
Майк
источник
источник
a = {};
.Ответы:
Вы не можете перебирать их напрямую, но можете найти все ключи, а затем просто отсортировать их.
Однако нет необходимости делать переменную a массивом. На самом деле вы просто используете его как объект и должны создать его следующим образом:
источник
for
цикл ifobj.hasOwnProperty(key)
.Вы можете использовать встроенный метод Object.keys :
(Примечание: это не работает в очень старых браузерах, не поддерживающих EcmaScript5, особенно в IE6, 7 и 8. Подробную актуальную статистику см. В этой таблице )
источник
if (!Object.keys) { Object.keys = function (obj) { var op, result = []; for (op in obj) { if (obj.hasOwnProperty(op) { result.push(op) } } return result }
вы даже можете прототипировать его на объекте:
и использование:
источник
key -> value
связи.Я согласен с ответом Свингли , и я думаю, что это важный момент, который отсутствует во многих из этих более сложных решений. Если вас интересуют только ключи в ассоциативном массиве и все значения равны «1», просто сохраните «ключи» как значения в массиве.
Вместо того:
Использование:
Единственным недостатком этого является то, что вы не можете так легко определить, установлен ли конкретный ключ. См. Этот ответ на функцию javascript inArray для ответа на эту проблему. Одна проблема с представленным решением заключается в том, что
a.hasValue('key')
оно будет немного медленнее, чемa['key']
. Это может иметь значение в вашем коде, а может и не иметь значения.источник
Нет краткого способа напрямую управлять «ключами» объекта Javascript. На самом деле он не предназначен для этого. Есть ли у вас свобода поместить данные в нечто лучшее, чем обычный объект (или массив, как предлагает ваш пример кода)?
Если да, и если ваш вопрос можно перефразировать как «Какой словарь-подобный объект мне следует использовать, если я хочу перебирать ключи в отсортированном порядке?» тогда вы можете разработать такой объект:
Если у вас нет контроля над тем, что данные находятся в обычном объекте, эта утилита преобразует обычный объект в ваш полнофункциональный словарь:
Для простоты это было определение объекта (вместо многократно используемой функции-конструктора); редактировать по желанию.
источник
Получите ключи в первом
for
цикле, отсортируйте его, используйте отсортированный результат во второмfor
цикле.источник
Вы можете использовать
keys
функцию из библиотеки underscore.js для получения ключей, а затемsort()
метод массива для их сортировки:keys
Функции в исходном коде Underscore в:источник
источник
источник
Мне очень нравится идея прототипа @ luke-schafer, но я также слышу, что он говорит о проблемах с прототипами. А как насчет использования простой функции?
Похоже, что это устраняет проблемы с прототипами и по-прежнему предоставляет отсортированный итератор для объектов. Однако я не совсем гуру JavaScript, поэтому хотел бы знать, есть ли в этом решении скрытые недостатки, которые я пропустил.
источник