1

我有一些大型 Rub​​y 结构,需要从中快速提取数据。我无法控制数据的格式,尽管我愿意在某些情况下对其进行转换。当使用 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 并手动匹配,或 .select 以获得常见的情况完全匹配并在之后回退前缀。还是我缺少一些常见的技巧。

4

2 回答 2

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]
于 2013-04-26T15:37:16.427 回答
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]}]
于 2013-04-26T15:45:11.043 回答