【问题标题】:Turn array into array of hashes (Ruby)将数组转换为哈希数组(Ruby)
【发布时间】:2021-10-16 22:10:42
【问题描述】:

我正在努力完成一项任务,该任务包括将数组转换为带有子元素的哈希数组。

基本上,我需要从一组标题中创建一个分层的 html 目录。

这是初始数组:

- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Quelles espèces de dauphins peut-on voir en Martinique ?
  level: 2
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Dauphin de Fraser
  level: 3
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Dauphin tacheté pantropical
  level: 3
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Dauphin d’Électre
  level: 3
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Le grand dauphin
  level: 3
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Globicéphale tropical
  level: 3
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Les meilleurs spots pour voir les dauphins en Martinique
  level: 2
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Conditions idéales pour l’observation des dauphins en Martinique
  level: 2
- !ruby/object:Prismic::Fragments::StructuredText::Block::Heading
  text: Comment se déroule cette balade en mer ?
  level: 2

基本上,我需要前一个数组看起来像这个哈希数组:

[
  {
    "text" => "Quelles espèces de dauphins peut-on voir en Martinique ?",
    "level" => 2,
    "children" => [
      {
        "text" => "Dauphin de Fraser",
        "level" => 3,
        "children" => []
      },
      {
        "text" => "Dauphin tacheté pantropical",
        "level" => 3,
        "children" => []
      },
      {
        "text" => "Dauphin d’Électre",
        "level" => 3,
        "children" => []
      },
      {
        "text" => "Le grand dauphin",
        "level" => 3,
        "children" => []
      },
      {
        "text" => "Globicéphale tropical",
        "level" => 3,
        "children" => []
      }
    ]
  },
  {
    "text" => "Les meilleurs spots pour voir les dauphins en Martinique",
    "level" => 2,
    "children" => []
  },
  {
    "text" => "Conditions idéales pour l’observation des dauphins en Martinique",
    "level" => 2,
    "children" => []
  },
  {
    "text" => "Comment se déroule cette balade en mer ?",
    "level" => 2,
    "children" => []
  }
]

因此,如果一个项目的level 值大于前一个项目,则该项目需要包含在前一个项目中。允许它创建一个层次结构的哈希数组。

对此有什么帮助吗?提前致谢!

【问题讨论】:

    标签: arrays ruby-on-rails ruby hash


    【解决方案1】:

    Ruby 的inject 方法应该可以解决您的问题:

    array.inject([]) do |ar,item|
      collection = case item.level
                   when 2
                     ar
                   when 3
                     ar[-1][:children]
                   when 4
                     ar[-1][:children][-1][:children]
                   when 5
                     ar[-1][:children][-1][:children][-1][:children]
                   # etc..
                   end
    
        collection.push {text: item.text,
                         level: item.level,
                         children: []}
      
      ar
    end
    

    array 是您在帖子中列出的 ruby​​ 对象数组。

    【讨论】:

    • 好的,这看起来不错,谢谢!有一件事,可以有更多23 级别......它也可以是456。我应该如何处理?我想我必须修改if item.level == 2...
    • 编辑了我的答案...这能满足您的需要吗?
    • 当然有办法做到这一点,而无需硬编码数字
    • 您应该能够将整个 case 语句替换为:collection = ar; (item.level - 2).times { collection = collection[-1][:children] }
    • @maxpleaner 你是真正的神。不知道这是如何工作的,但它确实有效。我应该稍后再挖掘它。非常感谢(wo)人!
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多