Выходной индекс хеша в массиве хешей? - PullRequest
0 голосов
/ 06 июля 2018

Это может быть глупый вопрос, но я пытаюсь вывести позиции массива хэшей, который у меня есть.

Если у меня есть массив хэшей, мы назовем some_array, который выглядит так:

some_array =
 [{:id=>7, :people=>["Bob B", "Jimmy J"], :product=>"product1"},
 {:id=>2, :people=>["Sally S"], :product=>"product1"},
 {:id=>5, :people=>["Hank H", "Stan C"], :product=>"product2"},
 {:id=>3, :people=>["Sue T"], :product=>"product2"},
 {:id=>4, :people=>["Anne W"], :product=>"product3"}]

Затем я повторяю, хотя some_array вот так:

some_array.select{|p| p[:product] == "product2"]}.each do |product|
     product[:people].join("<br>")         
     product[:product]

Какие выходы типа:

Hank K      product 2
Stan C

Sue T       product 2   

Как мне вывести вывод индекса / позиции каждого хеша в массиве?

Смогу ли я сделать что-то вроде:

some_array.select{|p| p[:product] == "product2"]}.each do |product|
     product.index
     product[:people].join("<br>")         
     product[:product]

И получите:

2   Hank K      product2
    Stan C

3   Sue T       product2

Спасибо!

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Вы можете просто использовать each_with_index и пропустить ненужный элемент

some_array.each_with_index do |product, index|
  next if product[:product] != "product2"
  index
  product[:people].join("<br>")
  product[:product]
end
0 голосов
/ 06 июля 2018

В Ruby вы можете связать методы на Enumerable, что позволяет вам вызвать with_index перед вами select, чтобы получить исходный индекс элемента:

some_array.each_with_index.select do |element, _|
  element[:product] == "product2"
end.each do |product, index|
  p [index, product[:people].join("<br />"), product[:product]]
end

# outputs:
# [2, "Hank H<br />Stan C", "product2"]
# [3, "Sue T", "product2"]

Хотя вы можете вызывать select.with_index, и это может показаться заманчивым, индекс не будет перенесен в each, потому что select возвращает элементы, которые совпадают, и не заботится о вводе , Однако, когда вы вызываете each_with_index (или each.with_index), у вас теперь есть новый Enumerable, каждый элемент которого в вашем массиве имеет свой индекс в этом массиве, и select в итоге возвращает эти новые элементы массива:

some_array.each.with_index.select { |element, _| element[:product] == "product2" }
# => [[{:id=>5, :people=>["Hank H", "Stan C"], :product=>"product2"}, 2],
      [{:id=>3, :people=>["Sue T"], :product=>"product2"}, 3]]
0 голосов
/ 06 июля 2018
fmt_str_first = "%-4d%-10s%10s"
fmt_str_rest  = "#{' '*4}%-10s"

some_array.each_with_index do |h,i|
  next unless h[:product] == "product2"
  first, *rest = h[:people]
  puts fmt_str_first % [i, first, "product2"]
  rest.each { |name| puts fmt_str_rest % name }
  puts
end

2   Hank H      product2
    Stan C

3   Sue T       product2

См. Kernel # sprintf . Обратите внимание, что %-10s в строке формата означает, что соответствующая запись, строка (s), должна быть отрегулирована влево (-) в поле ширины 10. %10s приведет к корректировке записи.

0 голосов
/ 06 июля 2018

Вы можете использовать each_with_index и отформатировать для своего варианта использования:

  some_array.each_with_index do |product, index|
    if product[:product] == "product2"
      p index
      p product
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...