首页 > 解决方案 > 将数组转换为哈希数组(Ruby)

问题描述

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

基本上,我需要从一组标题中创建一个分层的 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因此,如果一个项目的值大于前一个项目,则该项目需要包含在前一个项目中。允许它创建一个分层的哈希数组。

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

标签: arraysruby-on-railsrubyhash

解决方案


Ruby's inject method should solve your problem:

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

where is array is the array of ruby objects you listed in your post.


推荐阅读