【发布时间】:2015-08-14 09:03:26
【问题描述】:
我有一些我想迭代的哈希值,还有一些嵌套的哈希值可以达到 3-4 层, 我目前正在使用 if 语句来检查该值是否为哈希值,然后再次遍历它,但我只是在这里重复代码。
有没有使用方法的 DRY 方法来做到这一点?
我还希望最终输出出现在表格中,最好的方法是什么?这就是为什么我最初有多个 if 语句,所以我可以添加单独的标签。
示例方法:
<% def hashTest(key, value) %>
<% if value.is_a?(Hash) %>
<%= key %>
<% value.each do |key, value| %>
<%= key %>
<%= value %>
<% end %>
<% else %>
<%= key %>
<%= value %>
<% end %>
<% end %>
这就是我的 if 语句的混乱......
<% parsed.each do |key, value| %>
<% if value.is_a?(Hash) %>
<%= key %>
<br/>
<% value.each do |key, value| %>
<% if value.is_a?(Hash) %>
<%= key %>
<br/>
<% value.each do |key, value| %>
<% if value.is_a?(Hash) %>
<%= key %>
<br/>
<% value.each do |key, value| %>
<%= key %>
<%= value %>
<br/>
<% end %>
<% else %>
<%= key %>
<%= value %>
<br/>
<% end %>
<% end %>
<% else %>
<%= key %>
<%= value %>
<br/>
<% end %>
<% end %>
<% else %>
<%= key %>
<%= value %>
<br/>
<% end %>
<% end %>
示例输入:
{
"statement": {
"generated": "2015-01-11",
"due": "2015-01-25",
"period": {
"from": "2015-01-26",
"to": "2015-02-25"
}
},
"total": 136.03,
"package": {
"subscriptions": [
{ "type": "tv", "name": "Movies", "cost": 50.00 },
{ "type": "Phone", "name": "Landline", "cost": 5.00 },
{ "type": "broadband", "name": "Fibre", "cost": 16.40 }
],
"total": 71.40
},
"callCharges": {
"calls": [
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "07716393769", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 },
{ "called": "02074351359", "duration": "00:23:03", "cost": 2.13 }
],
"total": 59.64
},
"Store": {
"rentals": [
{ "title": "50 Shades of Grey", "cost": 4.99 }
],
"purchases": [
{ "title": "That's what she said", "cost": 9.99 },
{ "title": "Broke back mountain", "cost": 9.99 }
],
"total": 24.97
}
}
示例输出:
【问题讨论】:
-
请在您的预期输出中编辑一些示例输入。我们可以从你乱七八糟的 if 语句中推断出来,但我们不希望这样做。此外,与您的问题没有直接关系,但您正在滥用 ERb。您的模板中不应该有这么多代码。尤其不是方法定义。模板的全部目的是将代码与标记分开(参见 MVC 和关注点分离)。
-
嗯,这就是我需要这个方法的原因,所以我可以把它放在控制器中并消除混乱。
-
我理解第二个sn-p中的混乱;这就是你想要做的。这是我反对的第一个 sn-p,它显然是在视图中,而不是在控制器中。
-
啊,中肯的评论,那是因为我从视图中复制了if语句只是为了快速放在这里,添加了示例数据。
-
所以你只想要所有东西的键和值,用中断分隔? (你没有给出预期的输出。你不需要做所有事情,但前几行会很棒。)
标签: ruby methods hash iteration dry