检查数组元素是否存在于哈希中并删除它:Ruby

时间:2015-07-14 00:03:20

标签: ruby-on-rails arrays ruby hash

我有一个哈希和一个数组。我想检查数组元素是否在哈希中作为键,如果不是,则从哈希中删除键。

RegionScoreHash={"A"=>1, "B"=>0, "C"=>0, "D"=>1, "E"=>0, "F"=>0, "G"=>0}
RegionsArray=["B", "C", "D", "E", "F"]

需要结果:数组中存在元素的哈希(AG区域已删除)

ResultHash={"B"=>0, "C"=>0, "D"=>1, "E"=>0, "F"=>0}

4 个答案:

答案 0 :(得分:3)

使用Array' delete_if方法修改哈希值。

RegionScoreHash.delete_if { |k| !RegionsArray.include?(k) }

如果您想要新结果,请使用select之类的内容。

result = RegionScoreHash.select { |k| RegionsArray.include?(k) }

答案 1 :(得分:1)

删除效率低下。

ResultHash = RegionsArray.inject({}){|h, k| h[k] = RegionScoreHash[k]; h}

答案 2 :(得分:0)

试试这个

 RegionScoreHash={"A"=>1, "B"=>0, "C"=>0, "D"=>1, "E"=>0, "F"=>0, "G"=>0} 
 RegionsArray=["B", "C", "D", "E", "F"]
 RegionScoreHash.delete_if {|a| !RegionsArray.include?(a)}

作为建议,ruby方式应该是region_score_hash而不是RegionScoreHash。

答案 3 :(得分:0)

由于您已标记ruby-on-rails,我们假设您拥有ActiveSupport对Enumerable的扩展,允许使用exclude?

将其与哈希的delete_if方法

结合使用
RegionScoreHash.delete_if { |k, _v| RegionsArray.exclude?(k) }

并且您应该只使用RegionsArray中存在的键来获取哈希值。