Получить диапазон из хеш-записей - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть следующий хэш:

{
  "01/01"=>{:a=>0, :b=>2},
  "01/05"=>{:a=>1, :b=>0},
  "31/08"=>{:a=>26, :b=>32},
  "01/09"=>{:a=>2, :b=>9},
  "02/09"=>{:a=>0, :b=>3},
  "04/09"=>{:a=>0, :b=>4},
  "06/09"=>{:a=>0, :b=>26},
  "07/09"=>{:a=>0, :b=>2},
  "06/10"=>{:a=>0, :b=>1},
  "07/11"=>{:a=>0, :b=>1}
}

Этот хэш имеет 10 записей, но мне нужно отобразить только 7. Как я могу получить только 7 записей для использования значений?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Не совсем понятно, но, возможно, это может помочь.

Для получения первых семи значений :

h.values.first(7) # or h.values.take(7)
# => [{:a=>0, :b=>2}, {:a=>1, :b=>0}, {:a=>26, :b=>32}, {:a=>2, :b=>9}, {:a=>0, :b=>3}, {:a=>0, :b=>4}, {:a=>0, :b=>26}]

Чтобы получить первые семь ключей :

h.keys.first(7) # => ["01/01", "01/05", "31/08", "01/09", "02/09", "04/09", "06/09"]

Или получить только первые семь элементов, как уже указано в комментарии:

h.first(7).to_h
# {"01/01"=>{:a=>0, :b=>2}, "01/05"=>{:a=>1, :b=>0}, "31/08"=>{:a=>26, :b=>32}, "01/09"=>{:a=>2, :b=>9}, "02/09"=>{:a=>0, :b=>3}, "04/09"=>{:a=>0, :b=>4}, "06/09"=>{:a=>0, :b=>26}}

Редактировать: чтобы получить последние семь от конца до начала

h.values.last(7).reverse # => [{:a=>0, :b=>1}, {:a=>0, :b=>1}, {:a=>0, :b=>2}, {:a=>0, :b=>26}, {:a=>0, :b=>4}, {:a=>0, :b=>3}, {:a=>2, :b=>9}]
0 голосов
/ 08 сентября 2018

Вы можете использовать Hash # select со счетчиком.

h = {
  "01/01"=>{:a=>0, :b=>2},
  "01/05"=>{:a=>1, :b=>0},
  "31/08"=>{:a=>26, :b=>32},
  "01/09"=>{:a=>2, :b=>9},
  "02/09"=>{:a=>0, :b=>3},
  "04/09"=>{:a=>0, :b=>4},
  "06/09"=>{:a=>0, :b=>26},
  "07/09"=>{:a=>0, :b=>2},
  "06/10"=>{:a=>0, :b=>1},
  "07/11"=>{:a=>0, :b=>1}
}

n = 7
h.select { (n-=1) >= 0 }
  #=> {"01/01"=>{:a=>0, :b=>2},
  #    "01/05"=>{:a=>1, :b=>0},
  #    "31/08"=>{:a=>26, :b=>32},
  #    "01/09"=>{:a=>2, :b=>9},
  #    "02/09"=>{:a=>0, :b=>3},
  #    "04/09"=>{:a=>0, :b=>4},
  #    "06/09"=>{:a=>0, :b=>26}}
0 голосов
/ 08 сентября 2018

Первые 7 элементов

Вы можете использовать Array#slice для хеша, преобразованного в массив, а затем преобразовать обратно в хеш. Вот пример:

x = {
  "01/01"=>{:a=>0, :b=>2},
  "01/05"=>{:a=>1, :b=>0},
  "31/08"=>{:a=>26, :b=>32},
  "01/09"=>{:a=>2, :b=>9},
  "02/09"=>{:a=>0, :b=>3},
  "04/09"=>{:a=>0, :b=>4},
  "06/09"=>{:a=>0, :b=>26},
  "07/09"=>{:a=>0, :b=>2},
  "06/10"=>{:a=>0, :b=>1},
  "07/11"=>{:a=>0, :b=>1}
}

y = x.to_a.slice(0,7).to_h

Тогда y равно

{
  "01/01"=>{:a=>0, :b=>2},
  "01/05"=>{:a=>1, :b=>0},
  "31/08"=>{:a=>26, :b=>32},
  "01/09"=>{:a=>2, :b=>9},
  "02/09"=>{:a=>0, :b=>3},
  "04/09"=>{:a=>0, :b=>4},
  "06/09"=>{:a=>0, :b=>26}
}

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

y = x.slice("01/01", "01/05", "31/08", "01/09", "02/09", "04/09", "06/09")

С таким же результатом для y.

Hash#slice документы: https://ruby -doc.org / core-2.5.1 / Hash.html # method-i-slice

Последние 7 элементов

Вы можете использовать Array#last для хеша, преобразованного в массив, а затем преобразовать обратно в хеш. Вот пример:

x = {
  "01/01"=>{:a=>0, :b=>2},
  "01/05"=>{:a=>1, :b=>0},
  "31/08"=>{:a=>26, :b=>32},
  "01/09"=>{:a=>2, :b=>9},
  "02/09"=>{:a=>0, :b=>3},
  "04/09"=>{:a=>0, :b=>4},
  "06/09"=>{:a=>0, :b=>26},
  "07/09"=>{:a=>0, :b=>2},
  "06/10"=>{:a=>0, :b=>1},
  "07/11"=>{:a=>0, :b=>1}
}

y = x.to_a.last(7).to_h

Тогда y равно

{
  "01/09"=>{:a=>2, :b=>9},
  "02/09"=>{:a=>0, :b=>3},
  "04/09"=>{:a=>0, :b=>4},
  "06/09"=>{:a=>0, :b=>26},
  "07/09"=>{:a=>0, :b=>2},
  "06/10"=>{:a=>0, :b=>1},
  "07/11"=>{:a=>0, :b=>1}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...