簡體   English   中英

在excel vlookup中查找ruby數組中的鍵數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM