从Ruby数组哈希中提取项目的最有效方法

时间:2013-04-26 15:30:51

标签: ruby

我有一些大型的Ruby结构,我需要快速从中提取数据。我无法控制数据的格式,尽管在某些情况下我可以对其进行转换。当使用displayName作为“键”时,从以下哈希中提取单个项目的最有效方法是什么。

[
  {'displayName'=>'Some Key 1', 'values'=>[1,2,3]},
  {'displayName'=>'Some Key 2', 'values'=>["Some text"]},
  {'displayName'=>'Some Key 3', 'values'=>["Different text","More text"]},
  {'displayName'=>'Some Key 4', 'values'=>[2012-12-12]}
]

每个哈希都有其他密钥,我已删除它以帮助理解。

挑战在于,在某些情况下,需要在前缀子字符串上匹配displayName字段。是否有任何人有任何实际经验知道何时使用.each和手动匹配,或者。选择以获得常见情况完全匹配和后续前缀的后备。或者是否有一些我不知道的常见技巧。

2 个答案:

答案 0 :(得分:2)

如果你这样做了一次,你可能只需要遍历整个集合并找到你需要的东西:

row = data.find do |row|
  row['displayName'] == name
end

row && row['values']

如果你不止一次这样做,你应该用一个简单的变换从中创建一个索引结构来创建一个临时的衍生结构:

hashed = Hash[
  data.collect do |row|
    [ row['displayName'], row['values'] ]
  end
]

hashed[name]

答案 1 :(得分:0)

你可以使用简单的select认为它可能没有大尺寸数组那么快:

data = [
  {'displayName'=>'Some Key 1', 'values'=>[1,2,3]},
  {'displayName'=>'Some Key 2', 'values'=>["Some text"]},
  {'displayName'=>'Some Key 3', 'values'=>["Different text","More text"]},
  {'displayName'=>'Some Key 4', 'values'=>[2012-12-12]}
]

data.select { |e| e['displayName'] == 'Some Key 2' }.first

您可以group_by代替所需的密钥,以便更快地访问

hashed_data = data.group_by { |e| e['displayName'] }
hashed_data['Some Key 4']
=> [{"displayName"=>"Some Key 4", "values"=>[1988]}]