Сортировка хэша по массиву, включая информацию о критериях заказа - PullRequest
0 голосов
/ 08 марта 2012

Я использую Ruby on Rails 3.1, и я хотел бы заказать Hash из Array s, заботясь о порядке «указано» / «указано» в другом Array. То есть, например, у меня есть:

# This is the Hash of Arrays mentioned above.

hash = {
  1 => [
    "Value 1 1",
    "Value 1 2",
    "Value 1 n",
  ],
  2 => [
    "Value 2 1",
    "Value 2 2",
    "Value 2 n",
  ],
  3 => [
    "Value 3 1",
    "Value 3 2",
    "Value 3 n",
  ],
  m => [
    "Value m 1",
    "Value m 2",
    "Value m n",
  ]
}

и

# This is the Array mentioned above.

array = [m, 3, 1, 2]

Я бы хотел заказать hash ключи как "заявлено" / "указано" в array, чтобы иметь :

# Note that Hash keys are ordered as in the Array.

ordered_hash = {
  m => [
    "Value m 1",
    "Value m 2",
    "Value m n",
  ],
  3 => [
    "Value 3 1",
    "Value 3 2",
    "Value 3 n",
  ],
  1 => [
    "Value 1 1",
    "Value 1 2",
    "Value 1 n",
  ],
  2 => [
    "Value 2 1",
    "Value 2 2",
    "Value 2 n",
  ]
}

Как я могу сделать это (возможно, используя Enumerable модуль Ruby или какой-то неизвестный мне метод Ruby on Rails) ?

Ответы [ 2 ]

3 голосов
/ 08 марта 2012
sorted_array = hash.sort_by { |k,v| array.index(k) }

Если вы хотите упорядочить и хэш, вам нужно использовать ActiveSupport :: OrderedHash, например,

sorted_array = hash.sort_by { |k,v| array.index(k) }
sorted_hash  = ActiveSupport::OrderedHash[sorted_array]
0 голосов
/ 08 марта 2012

В этом игрушечном примере метод Джеймса, использующий array.index, подойдет, но если бы хэш или массив были большими, вам бы не хотелось делать .index снова и снова. Более эффективный способ будет:

Hash[*array.map {|i| [i, hash[i]]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...