我有哈希数据(最初是在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"}]
如何改进我的代码?
答案 0 :(得分:4)
你可以做(铁路):
parseddata.slice(*selectedtax).values
甚至更简单(纯红宝石):
parseddata.values_at(*selectedtax)
slice
和values_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)