arrays - 将数组转换为哈希数组(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
因此,如果一个项目的值大于前一个项目,则该项目需要包含在前一个项目中。允许它创建一个分层的哈希数组。
有什么帮助吗?提前致谢 !
解决方案
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.
推荐阅读
- algorithm - 分区问题 - 使用最少的内存查找集合中的元素
- mysql - 在mysql中加入5个表,在同一个查询中显示两个不同表的两个SUM列
- java - 对象与“按引用传递”的 1:1 关系
- node.js - 如何在 Google Cloud App Engine for Node.js 中使用 Memcache
- mysql - mysql中“Json文档”这个词是什么意思?
- macos - 如何在 MacOS 上使用 AccountName 中的空格创建/更新用户
- spring-boot - 带有 MANUAL_IMMEDIATE ack 的 Spring Boot Kafka
- sql - 如何对结果数据进行分组和限制
- angular - 如何在javascript中与Observable内部循环合并?
- html - 在(第一个到最后一个)或(最后一个到第一个)幻灯片之间滑动时,Swiper.js 无法呈现“Apex-Chart”系列