2009-11-09 4 views

ответ

0

В каком порядке вы хотели бы, чтобы они были? Вы не должны ожидать, что они будут в порядке ввода. Из docs for Hash:

Порядок, в котором вы пройти хэш либо ключ или значение может показаться произвольно, и, как правило, не может быть в порядке вставки .

Если вам нужно, чтобы они были в определенном порядке, вы можете определить только с помощью ключей/значений (например, упорядочить имена атрибутов в алфавитном порядке), вам необходимо будет применить этот порядок явно.

1

Обычные способы сортировки хэша - это ключ или значение. Посмотрите здесь:

hash.sort

Более сложные виды можно accomplised однако за счет использования оператору космического корабля

2
h = Hash[:x,123,:a,553,:d,949,:e,5321] 
=> {:e=>5321, :x=>123, :a=>553, :d=>949} 
h.sort { |x,y| x[0].to_s <=> y[0].to_s } 
=> [[:a, 553], [:d, 949], [:e, 5321], [:x, 123]] 
4

рубин 1.8 хеш не в порядке вставки. С ruby ​​1.9 они будут.

Однако рельсы предлагают альтернативу этому классу OrderedHash.

my_hash = ActiveSupport::OrderedHash.new 
my_hash[:key] = 'value' 
my_hash[:second_key] = 'second value' 

Этот хэш фактически массив этого формата:

[[:key, 'value'], [:second_key, 'second value']] 

Записи остается в порядке, вставленный их.
И вы можете получить к ним доступ, как с любым другим хэшем.

+0

Пробовал это без везения. Он по-прежнему отображается случайным образом. Использование Ruby 1.8.7. – Jeffrey

0

Этот фрагмент кода, который я только что сделал для i18n-js, может помочь вам, поскольку он конвертирует Hash в ActiveSupport :: OrderedHash, если необходимо, а затем сортирует его по естественному порядку.

http://seb.box.re/2010/1/15/deep-hash-ordering-with-ruby-1-8

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