从数组数组中收集唯一属性的更有效方法

时间:2015-01-19 14:44:55

标签: ruby

给出如下数据结构:

[ 
  [
    "1", 
    {
      :user_uid=>"1", 
      :display_name=>"joe", 
      :country_code=>"ITA", 
      # more attributes
    }
  ],
  # more users
]

我可以获得所有country_code属性的唯一列表,如下所示:

users.map do |uid, attributes|
  attributes[:country_code]
end.uniq

但如果我有一个非常大的数据集,这仍然会遍历每个用户(正如Ajedi32指出的那样,当然是这种情况)。

是否有更有效的方法来收集这些数据?

2 个答案:

答案 0 :(得分:1)

对于1个用户,当我比较每个方法运行500次所花费的时间时,我发现以下速度比uniq快。可以帮到你。

begin
  array = []

  users.each do |_, attributes|
    array |= [attributes[:country_code]]
    # http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-7C
  end

  array
end

答案 1 :(得分:1)

我建议:

 require 'set`

 users.each_with_object(Set.new) { |(_, attributes),s|
     s <<  attributes[:country_code]  }.to_a