这可能是一个愚蠢的问题,但是我正在努力输出我所拥有的哈希数组的位置。
如果我有一组哈希,我们将调用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
谢谢!
答案 0 :(得分:1)
您可以使用each_with_index并将其格式化为用例:
some_array.each_with_index do |product, index|
if product[:product] == "product2"
p index
p product
end
end
答案 1 :(得分:1)
在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]]
答案 2 :(得分:1)
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
将导致该条目被右调整。
答案 3 :(得分:1)
您可以只使用each_with_index
并跳过不需要的项目
some_array.each_with_index do |product, index|
next if product[:product] != "product2"
index
product[:people].join("<br>")
product[:product]
end