哈希数组中哈希的输出索引?

时间:2018-07-05 22:42:25

标签: ruby

这可能是一个愚蠢的问题,但是我正在努力输出我所拥有的哈希数组的位置。

如果我有一组哈希,我们将调用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 :(得分: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