繁体   English   中英

如何循环遍历 Ruby 数组中的哈希

[英]How do I Loop through an Hash in a Ruby Array

我使用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 }来做到这一点@grouped_test_specific_reports.each { |key, value| puts key } @grouped_test_specific_reports.each { |key, value| puts key }

  • 《视觉测试设备》
  • “超声波仪器”和
  • “超声波探头”

现在我们必须在另一个循环中迭代这些值,它恰好是一个数组,以便能够比较equipment_amount

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

这是 UI 的代码:

- @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

我个人觉得你问的问题有点不清楚。 为此,我在评论中与您讨论了一些事情。 从我们在评论中的讨论来看,您似乎只是想遍历每个组的分组值。

首先,我想弄清楚group_by到底做了什么,因为这似乎是问题所在。 对您当前工作的简单误解。

group_by { |对象| 块 } → a_hash

group_by → an_enumerator

按块的结果对集合进行分组。 返回一个散列,其中键是块的计算结果,值是集合中与键对应的元素数组。

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

 (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回路通过所述组的值。 由于您循环处理两个不同的内容,因此您无法轻松将其更改为单个循环。 这里要记住的重要一点是,属于组键的值不是单个值,而是一组值(数组)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM