2014-10-26 72 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 
相关问题