在excel vlookup中查找ruby数组中的键数组

时间:2012-04-02 20:59:03

标签: ruby arrays hash hashmap

这篇文章与我之前的文章非常相似,但这里的数据结构不同: 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的原始顺序,返回数据应该是哈希数组。

2 个答案:

答案 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)

@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倍。