[英]Looking up an array of keys on an array of hashes in ruby like excel vlookup
這篇文章與我之前的帖子非常相似,但數據結構在這里有所不同:將一組鍵連接到具有鍵值對的哈希,如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的原始順序,返回數據應該是哈希數組。
isbns.map { |isbn| data.find { |h| h["isbn"] == isbn} }
#=> [{"isbn"=>"1234", "title"=>"apple"}, {"isbn"=>"2121", "title"=>"car"}, nil, {"isbn"=>"5678", "title"=>"banana"}]
@Michael Kohl的回答簡明扼要。 但是,如果這些數據集很大,則效率低(O * n * m / 2)。 另一種方法是將數據向量轉換為O(m)中的散列,然后在O(n)中對O(n + m)的運行時進行映射。
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倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.