2013-03-01 47 views
1

我有一个代码,可以在其中打印所有密钥和散列值。我想让它可配置,这样就不用打印所有的按键,而只需打印所需的按键。假设我有密钥k1,k2,k3 ... k20。我想打印k1,k3,k8 .... k15,k18。什么是最好的方式去做这件事?仅打印选择键而不是所有键值对?

这是相关的代码片段 - :

<%@order_items.each do |order_item|%> 
     <h5>Order Item</h5> 
     <%order_item.each do |key,value|%> 

      <table cellspacing=2> 

      <tr><td><%=key.capitalize%>: </td> <td><%= value %></td></tr> 

      </table> 
     <%end%> 
     <%end%> 
+0

要保持键是一些序列,也可以是任意组的值用户提供? – Arindam 2013-03-01 10:01:27

+0

@Arindam - Keys可以是用户提供的任何一组值。这些键实际上对应于表中的列。 – 2013-03-01 10:11:05

回答

2

你可以这样做也是这个

<% [1,3,8,15,18].each do |key|; value = order_item[key] %> 
+0

回复,这可能有效。现在给它一个尝试。 – 2013-03-01 10:09:52

+0

<%[:id,:order_id,:status] .each do | key |;值= order_item [键]%>正在工作。干杯。 – 2013-03-01 10:30:23

2

有了类似的东西:

<% order_item.select{|k,_| [1,3,8,15,18].include?(k)}.each do |key,value| %> 
+0

请注意,在Ruby 1.9.3中它会返回一个散列(http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-select),但在红宝石1.8.7中它返回一个数组(http://www.ruby-doc.org/core-1.8.7/Hash.html#method-i-select),在应用'| key,value |'前,需要将其转换回散列值。块 – Arindam 2013-03-01 09:59:10

+0

@Arindam它实际上在'1.8.7'中工作。它被转换为一个'Array',但是它们将作为pair来传递,因为select会生成一个数组 - 一组数组 - 一组数组 - 。 – oldergod 2013-03-01 10:02:35

+0

是的好点。我个人不喜欢那种漂浮的代码。 '由于特定的本地实现而散列为散列'的数组?不是一个好习惯。因此指出了这一点,以便无辜的人在某个时间点不会被控告:-) – Arindam 2013-03-01 10:05:21

2

尝试:

class Hash 
    def select_keys(*args) 
    select {|k,v| args.include?(k) } 
    end 
end 

然后你就可以拨打:

h.select_keys(1,3,8,15,18) 

OR

你可以使用:

hash.slice(1,3,8,15,18) 
# => { '1' => 'value1', '3' => 'value2', '8' => 'value3', '15' => 'value4', '18' => 'value5' }