我有一个数组:
array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]
然后我有一个哈希:
hash = {"one" => "Defined",
"two" => "Test"
}
我需要遍历array
中的每个对象,看看该对象是否包含hash
键中的子字符串。如果找到,则应返回hash
值。否则,它应该返回undefined
。最终目标是创建一个如下所示的数组:
final_array = ["Defined,"Test","Undefined","Defined"]
如何有效地编写该循环?
答案 0 :(得分:2)
这是一种方法:
array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]
hash = {"one" => "Defined","two" => "Test"}
array.map{|e| hash.find(proc{["undefined"]}){|k,v| e.downcase.include? k}.last}
# => ["Defined", "Test", "undefined", "Defined"]
说明:
Enumerable#find 将是个好主意。正如doc所说 - 通过enum中的每个条目来阻止。返回第一个块不为false的块。 如果没有对象匹配,则调用ifnone并在指定时返回其结果,否则返回nil。
我使用Array#map
并将每个元素字符串传递给块。现在在块中,我在#find
上调用了hash
。现在hash.find
将每个key/value
对传递给hash.find
方法块。在该块中,我在String#include?
上调用e
方法,将 key 作为参数传递给#include?
方法。如果#include?
测试结果true
,则返回该迭代的key/value
,否则将执行默认参数proc{["undefined"]}.call
。
希望有所帮助!
答案 1 :(得分:0)
hash = {"one" => "Defined", "two" => "Test"}
array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]
hash.default = "Undefined"
keys = hash.keys
array.map {|a| hash[(a.split.map(&:downcase) & keys).first]}