这篇文章与我之前的文章非常相似,但这里的数据结构不同: Joining an array of keys to a hash with key value pairs like excel vlookup
我的Mysql2 :: Result中的数据回来像这个哈希数组:
data = [{"isbn" => "1234", "title"=>"apple"},{"isbn" => "5678", "title"=>"banana"},{"isbn" => "2121", "title"=>"car"}]
我想要比较的原始isbns列表是这个数组:
isbns = ["1234","2121", "5454", "5678"]
我正在寻找一个使用isbns数组的函数,并返回如下结果:
result = [{"isbn"=>"1234","title"=>"apple"}, {"isbn"=> "2121", "title"=>"car"}, nil, {"isbn"=>"5678","title"=>"banana"}]
“驱动”数组是isbns ...想象一下从isbns到数据的vlookup ......任何不在数据中但在isbns中的项应该返回nil。应该返回isbns的原始顺序,返回数据应该是哈希数组。
答案 0 :(得分:1)
isbns.map { |isbn| data.find { |h| h["isbn"] == isbn} }
#=> [{"isbn"=>"1234", "title"=>"apple"}, {"isbn"=>"2121", "title"=>"car"}, nil, {"isbn"=>"5678", "title"=>"banana"}]
答案 1 :(得分:1)
data_lookup = data.inject({}) {|m,v| m[v["isbn"]] = v; m} # O(data.size)
result = isbns.map { |isbn| data_lookup[isbn] } # O(isbns.size)
如果你的数据和isbn集合的大小都是1000,那么速度会提高250倍。