如何使用数组在散列中存在不存在的元素时返回字符串

时间:2017-04-18 21:54:23

标签: arrays ruby ruby-hash

我有这个哈希和这个数组,并执行以下命令......

hash={"a"=>1,"b"=>2,"c"=>3,"d"=>4,"e"=>5,"f"=>6}
array=["b","a","c","f","z","q"]
print hash.values_at(*array).compact

所以我希望它返回类似的东西:

#=> [2,1,3,6,"invalid","invalid"]

是否有办法将散列中不存在的所有其他元素声明为“无效”,而不逐一声明(例如“g”=>“无效”,“h”=>“无效”)。 ..)?

3 个答案:

答案 0 :(得分:3)

如果哈希必须使用不存在的键的默认值进行响应,则必须设置此值。通常它是在哈希初始化时设置的:

hash = Hash.new("invalid")

但可以随时进行

hash={"a"=>1,"b"=>2,"c"=>3,"d"=>4,"e"=>5,"f"=>6}
array=["b","a","c","f","z","q"]

hash.default = "invalid"
p hash.values_at(*array)  #compact is superfluous

# => [2, 1, 3, 6, "invalid", "invalid"]

答案 1 :(得分:3)

array.map do |key|
  hash.fetch key, 'invalid'
end

如果使用一个参数调用fetch,那么如果该键不存在则会引发错误。但是,可选的第二个参数可以为不存在的键设置自定义返回值。

这超过hash.default=或在Hash构造函数中传递默认值的好处是散列本身没有改变,所以如果你以后查找一个不存在的键,它将按预期返回nil而不是'invalid ”。

答案 2 :(得分:2)

试试这个:

array.map { |key|
    hash.has_key?(key) ? hash[key] : 'invalid'
}