如何简化与数组的哈希交集

时间:2014-05-21 08:06:41

标签: ruby arrays hash

我有哈希数据(最初是在json中)和一组选定的哈希键:

jsondata ='{"1":
          {"name": "Tax Exempt"},
       "2":
          {"name": "Tax on Purchases"},
       "3":
          {"name": "Tax on Sales"},
       "4":
          {"name": "Service Tax"}              
        }'
parseddata = JSON.parse(jsondata);    
selectedtax = ["2","3"]

我的代码映射键并返回数组中存在的哈希值。这是代码:

selectedtaxdetails = Array.new
parseddata.map do |key,value|  
  if selectedtax.include? key 
    selectedtaxdetails << value               
  end
end  

selectedtaxdetails的输出是:

[{"name": "Tax on Purchases"},{"name": "Tax on Sales"}] 

如何改进我的代码?

2 个答案:

答案 0 :(得分:4)

解决方案:

你可以做(​​铁路):

parseddata.slice(*selectedtax).values

甚至更简单(纯红宝石):

parseddata.values_at(*selectedtax)

说明:

slicevalues_at方法都需要一个键列表。如果你只是传递一个数组,它将搜索这个数组是键的值,这显然不是你想要的。相反,您可以使用splat运算符(*)。它将接受一个数组的每个元素,并将它作为一个单独的参数传递给一个方法,这是我们想要的。

更新

要实现结构:[{"code":"2", "name": "Tax on Purchase"},{"code":"3", "name": "Tax on Sales"}]你可以做(​​轨道):

parseddata.slice(*selectedtax).map {|key, value| value.dup.tap {|h| h['code'] = key}}

或纯红宝石:

parseddata.select{|key,_| selectedtax.include? key}.map {|key, value| value.dup.tap {|h| h['code'] = key}}

答案 1 :(得分:0)

以下内容应该在一行中执行相同的操作

parseddaata.values_at(*selectedtax)