如何遍历Ruby数组中的哈希值

时间:2018-12-30 11:50:07

标签: ruby-on-rails ruby

我使用group_by获得了一定的期望结果。根据答案中的解释,我更新了我的问题以反映答案,以查看达到解决方案所采取的步骤,并查看编辑历史记录。

@grouped_test_specific_reports = TestSpecificReport.all.group_by(&:equipment_type_name)

上面的代码产生了以下结果:

    2.5.1 :026 > pp @grouped_test_specific_reports
{"Ultrasonic Probes"=>
  [#<TestSpecificReport:0x00007f832aa2d6e0
    id: 10,
    equipment_type_id: 2,
    test_method_id: 1,
    equipment_amount: "Multiple",
    equipment_heading: "UT Probes">],
 "Ultrasonic Instruments"=>
  [#<TestSpecificReport:0x00007f832aa2d3c0
    id: 8,
    equipment_type_id: 1,
    test_method_id: 1,
    equipment_amount: "Single",
    equipment_heading: "UT Instrument">],
 "Visual Test Equipment"=>
  [#<TestSpecificReport:0x00007f832aa2cfb0
    id: 11,
    equipment_type_id: 4,
    test_method_id: 1,
    equipment_amount: "Single",
    equipment_heading: "VT Equipment">]}
 => {"Ultrasonic Probes"=>[#<TestSpecificReport id: 10, equipment_type_id: 2, test_method_id: 1, equipment_amount: "Multiple", equipment_heading: "UT Probes">], "Ultrasonic Instruments"=>[#<TestSpecificReport id: 8, equipment_type_id: 1, test_method_id: 1, equipment_amount: "Single", equipment_heading: "UT Instrument">], "Visual Test Equipment"=>[#<TestSpecificReport id: 11, equipment_type_id: 4, test_method_id: 1, equipment_amount: "Single", equipment_heading: "VT Equipment">]} 

我的下一个目标是通过浏览器的键列出浏览器中的分组测试专用报告,我可以通过@grouped_test_specific_reports.each { |key, value| puts key }

来做到这一点。
  • “视觉测试设备”
  • “超声仪器”和
  • “超声波探头”

现在,我们必须在另一个循环中遍历恰好是数组的值,以便能够比较equipment_amount

带有equipment_amount: "Multiple"的值前面将带有加号图标,带有equipment_amount: "Single"的值将只是一个下拉列表:

这是用户界面的代码:

- @grouped_test_specific_reports.each do |equipment_type_name, test_specific_reports|
  .form-group.row
    .col-sm-6
      %label
        = equipment_type_name
      = select_tag '', options_from_collection_for_select(test_specific_reports, :id, :equipment_heading), { include_blank: "Select #{equipment_type_name} List", class: 'form-control select2', style: 'width: 100%;' }
    .col-sm-1
      - test_specific_reports.each do |test_specific_report|
        - if test_specific_report.equipment_amount == 'Multiple'
          .icon.text-center
            %i.fa.fa-plus-circle.add-icon

1 个答案:

答案 0 :(得分:1)

我个人发现您要问的问题有点不清楚。因此,我与您讨论了评论中的一些内容。从我们在评论中的讨论看来,您似乎只是想遍历每个组的分组值。

首先,我想弄清楚group_by的确切功能,因为这似乎是问题所在。对您当前正在做的事情有一个简单的误解。

  

group_by {| obj |阻止}→a_hash

     

group_by→枚举数

     

根据块的结果对集合进行分组。返回一个哈希值,其中键是该块的评估结果,值是集合中与该键对应的元素的数组。

     

如果没有给出块,则返回一个枚举数。

(1..6).group_by { |i| i%3 }   #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]}

文档清楚地表明,分组哈希具有从块求值的键(返回值)。属于键的值实际上是评估为相同结果的值列表。这意味着您可以通过以下方式简单地遍历这些值。

grouped_values = (1..6).group_by { |n| n % 3 }

grouped_values.each do |key, values|
  puts "Key: #{key}"

  values.each do |value|
    puts "Value: #{value}"
  end
end

第一个each在组中循环。第二个each遍历该组的值。由于您遍历了两个不同的事物,因此无法轻松地将其更改为一个循环。这里要记住的重要一点是,属于组键的值不是单个值,而是一组值(数组)。