我有一系列哈希:
arr = [{"id"=>"1", "name"=>"Alan"}, {"id"=>"2", "name"=>"Ben"}, {"id"=>"3", "name"=>"Carl"}, {"id"=>"4", "name"=>"Danny"}, {"id"=>"5", "name"=>"Eva"}]
如果我要找到id#4的名称:
arr.find{ |a| a["id"] == "4" }["name"]
返回“Danny”,这就是我想要的。
我的问题是,是否有更短,更优雅的方式来完成相同的搜索?
答案 0 :(得分:4)
如果你只需要查找一个id,就可以进行线性搜索。
如果在同一个数组上进行多次查找,请从数组中创建一个哈希,因此单个查找为O(1)
h = Hash[arr.map{|a|[a["id"], a["name"]]}]
h["4"]
答案 1 :(得分:0)
这是一种非常合理的方式。我看到的唯一问题是您的数据结构不是查找友好的。您需要在数组中搜索,而不是在哈希中按ID查找。在数组中搜索是O(N)并且是相对更难的代码。查找哈希是O(1)并且根本没有代码。
所以,我会将你的数组转换为hash,然后查找它。特别是,如果您打算进行多次查找。
people = arr.inject({}) {|memo,v| memo[v["id"].to_i]=v["name"]; memo}
people[4] # will return Danny
people[3] # will return Carl
希望它有所帮助!