2014-10-26 47 views
0

我有一個大陣列,如:如何將新密鑰添加到json哈希數組中?

[ 
{id: 1, name: 'abs', surname: 'abs'}, 
{id: 1, name: 'abs', surname: 'abs'}, 
... 
{id: 1, name: 'abs', surname: 'abs'}, 
] 

,我需要添加新的「組」鍵到每個哈希值。前5個哈希應該有'組':1,後5個哈希應該有'組':2個得到的結果數組:

[ 
{id: 1, name: 'abs', surname: 'abs', group: 1}, 
{id: 1, name: 'abs', surname: 'abs', group: 1}, 
{id: 1, name: 'abs', surname: 'abs', group: 1}, 
{id: 1, name: 'abs', surname: 'abs', group: 1}, 
{id: 1, name: 'abs', surname: 'abs', group: 1}, 
{id: 1, name: 'abs', surname: 'abs', group: 2}, 
... 
{id: 1, name: 'abs', surname: 'abs', group: N}, 
] 

如果我使用陣列#GROUP_BY和Array#each_with_index方法的代碼工作緩慢,原因陣列有很多記錄...我如何使用Ruby它使代碼的運行速度呢?

回答

1

我減少了你的輸入樣本,因爲不需要那麼大的樣本。您可以插值怎麼做你從這個代碼需要的東西:

require 'json' 

foo = [ 
    {id: 1, name: 'abs', surname: 'abs'}, 
    {id: 1, name: 'abs', surname: 'abs'}, 
    {id: 1, name: 'abs', surname: 'abs'}, 
    {id: 1, name: 'abs', surname: 'abs'}, 
] 

foo.each_slice(2).with_index(1){ |a, i| a.each{ |h| h[:group] = i } } 
puts foo.to_json 
# >> [{"id":1,"name":"abs","surname":"abs","group":1},{"id":1,"name":"abs","surname":"abs","group":1},{"id":1,"name":"abs","surname":"abs","group":2},{"id":1,"name":"abs","surname":"abs","group":2}] 

這裏就是它看起來像爆發了更可讀:

puts JSON::pretty_generate(foo) 
# >> [ 
# >> { 
# >>  "id": 1, 
# >>  "name": "abs", 
# >>  "surname": "abs", 
# >>  "group": 1 
# >> }, 
# >> { 
# >>  "id": 1, 
# >>  "name": "abs", 
# >>  "surname": "abs", 
# >>  "group": 1 
# >> }, 
# >> { 
# >>  "id": 1, 
# >>  "name": "abs", 
# >>  "surname": "abs", 
# >>  "group": 2 
# >> }, 
# >> { 
# >>  "id": 1, 
# >>  "name": "abs", 
# >>  "surname": "abs", 
# >>  "group": 2 
# >> } 
# >> ] 

這裏是正在發生的事情:

  • each_slice將數組切片成N個大小的塊。

    pp foo.each_slice(2).to_a 
    # >> [[{:id=>1, :name=>"abs", :surname=>"abs", :group=>1}, 
    # >> {:id=>1, :name=>"abs", :surname=>"abs", :group=>1}], 
    # >> [{:id=>1, :name=>"abs", :surname=>"abs", :group=>2}, 
    # >> {:id=>1, :name=>"abs", :surname=>"abs", :group=>2}]] 
    
  • with_index增加一個遞增值以傳遞到塊參數列表。在該塊中分配給i

    pp foo.each_slice(2).with_index(1).to_a 
    # >> [[[{:id=>1, :name=>"abs", :surname=>"abs", :group=>1}, 
    # >> {:id=>1, :name=>"abs", :surname=>"abs", :group=>1}], 
    # >> 1], 
    # >> [[{:id=>1, :name=>"abs", :surname=>"abs", :group=>2}, 
    # >> {:id=>1, :name=>"abs", :surname=>"abs", :group=>2}], 
    # >> 2]] 
    
+0

但我必須組5個元素,所以前5個要素應該有 「組:1」,接下來的5個元素應該有「組:2 「... – bmalets 2014-10-26 23:35:38

+0

你可以從答案中的代碼中找出結果。 – 2014-10-26 23:38:07

+0

親切地感謝你 – bmalets 2014-10-26 23:39:15

0

怎麼樣:

foo = [ 
    {id: 1, name: 'abs', surname: 'abs'}, 
    {id: 1, name: 'abs', surname: 'abs'}, 
    {id: 1, name: 'abs', surname: 'abs'}, 
    {id: 1, name: 'abs', surname: 'abs'}, 
] 
group_count =5 

foo.each_with_index do |u,i| 
    u['highlight_group'] = i.div(group_count) 
end 

puts foo 
相關問題