簡體   English   中英

根據哈希鍵和值創建對象數組

[英]Create array of objects from hash keys and values

我有一個數組中的產品代碼集合: @codes 然后,我檢查一下每個產品有多少個實例:

@popular = Hash.new(0)

@codes.each do |v|
    @popular[v] += 1
end

這會產生類似{ code1 => 5, code2 => 12}的哈希。 我真正需要的是以下形式的數組:

[ {:code => code1, :frequency => 5}, {:code => code2, :frequency => 12} ]

如何從正在生成的哈希中構建類似的數組? 另外,還有更直接的路線嗎? 有問題的對象是具有:code屬性的ActiveModel對象。 提前致謝!

@popular.map { |k, v| { code: k, frequency: v } }

這將產生一個Hash數組。 如果需要模型數組,請使用適當的構造函數替換內部的{...}

將您的代碼更改為

@codes.each_with_object([]) do
  |code, a|
  if h = a.find{|h| h[:code] == code}
    h[:frequency] += 1
  else
    a.push(code: code, frequency: 0)
  end
end

對於速度:

@codes.group_by{|e| e}.map{|k, v| {code: k, frequency: v.length}}

不是最有效的,但這是另一種方式:

def counts(codes)
  codes.uniq.map { |e| { code: e, frequency: codes.count(e) } }
end

codes = %w{code5 code12 code5 code3 code5 code12 code7}
  #=> ["code5", "code12", "code5", "code3", "code5", "code12", "code7"]
counts(codes)
  #=> [{:code=>"code5", :frequency=>3}, {:code=>"code12", :frequency=>2},
  #    {:code=>"code3", :frequency=>1}, {:code=>"code7" , :frequency=>1}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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