Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何用数组简化哈希求交_Ruby_Arrays_Hash - Fatal编程技术网

Ruby 如何用数组简化哈希求交

Ruby 如何用数组简化哈希求交,ruby,arrays,hash,Ruby,Arrays,Hash,我有散列数据(最初是json格式)和一组选定的散列键: jsondata ='{"1": {"name": "Tax Exempt"}, "2": {"name": "Tax on Purchases"}, "3": {"name": "Tax on Sales"}, "4": {"name": "Service Tax"} }'

我有散列数据(最初是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  
如何改进代码?

解决方案: 您可以执行以下操作(rails):

或者更简单(纯红宝石):

说明:
slice
values\u at
方法都需要一个键列表。如果您只传递一个数组,它将在该数组为键的位置搜索值,这显然不是您想要的。相反,您可以使用splat操作符(
*
)。它将接受数组的每个元素,并将其作为单独的参数传递到方法中,这正是我们在这里想要的

更新: 要实现结构:
[{“code”:“2”,“name”:“Tax on Purchase”},{“code”:“3”,“name”:“Tax on Sales”}]
您可以执行(rails):

或者使用纯红宝石:

parseddata.values_at(*selectedtax)
parseddata.select{|key,_| selectedtax.include? key}.map {|key, value| value.dup.tap {|h| h['code'] = key}}
解决方案: 您可以执行以下操作(rails):

或者更简单(纯红宝石):

说明:
slice
values\u at
方法都需要一个键列表。如果您只传递一个数组,它将在该数组为键的位置搜索值,这显然不是您想要的。相反,您可以使用splat操作符(
*
)。它将接受数组的每个元素,并将其作为单独的参数传递到方法中,这正是我们在这里想要的

更新: 要实现结构:
[{“code”:“2”,“name”:“Tax on Purchase”},{“code”:“3”,“name”:“Tax on Sales”}]
您可以执行(rails):

或者使用纯红宝石:

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

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

parseddaata.values_at(*selectedtax)

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

parseddaata.values_at(*selectedtax)

如果您解释splat运算符的用法,这个答案会更好。@MikeCampbell的+1-在这里。:)谢谢工作完美。还有一个问题,如果我想返回{“代码”:“2”,“名称”:“购买税”},{“代码”:“3”,“名称”:“销售税”}。如何为返回的数组构造新结构?@Axil-这是rails(ActiveSupport core extension)方法,稍后我将使用非rails代码进行更新。:)如果您解释splat运算符的用法,这个答案会更好。@MikeCampbell的+1-在这里。:)谢谢工作完美。还有一个问题,如果我想返回{“代码”:“2”,“名称”:“购买税”},{“代码”:“3”,“名称”:“销售税”}。如何为返回的数组构造新结构?@Axil-这是rails(ActiveSupport core extension)方法,稍后我将使用非rails代码进行更新。:)您应该使用一些下划线:
selected\u tax\u details
更易于阅读您的代码无效。json解析是否与您的问题相关?如果没有,请将其拆下。用Ruby表示散列。只提供相关部分。你怎么了?代码的哪一部分不起作用!我刚刚用ruby运行了这个程序,当然需要“json”,它可以工作。@Axil-您错过了这里的开头引语:
selectedtax=[“2”,3”]
您应该使用一些下划线:
所选的税务详细信息
更易于阅读。您的代码无效。json解析是否与您的问题相关?如果不相关,请删除它。在Ruby中给出哈希值。只给出相关部分。sawa出了什么问题?代码的哪部分不起作用!我只是在Ruby中运行了这个,当然需要'j'“son”和它的工作原理。@Axil-你错过了这里的一个开场白:
selectedtax=[“2”,3”]