【问题标题】:How add new key into array of json hashes?如何将新键添加到 json 哈希数组中?
【发布时间】:2014-10-26 23:12:12
【问题描述】:

我有一个大数组,例如:

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

我需要在每个散列中添加新的“组”键。前五个散列应该有 'group': 1,后五个散列应该有 'group': 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},
]

如果我使用 Array#group_by 和 Array#each_with_index 方法,代码运行缓慢,因为数组有很多记录...如何使用 ruby​​ 来让代码运行得更快?

【问题讨论】:

    标签: ruby arrays json hash grouping


    【解决方案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]]
      

    【讨论】:

    • 但是我需要在组中有 5 个元素,所以前 5 个元素应该有“group: 1”,接下来的 5 个元素应该有“group: 2”...
    • 您可以从答案中的代码中找出答案。
    • 我不想给你确切代码,因为重要的是教人们如何钓鱼,即如何解决这个问题,而不是给你一个鱼,即给你回答这个问题的代码。这是一个老家伙的事情。 :-)
    【解决方案2】:

    怎么样:

    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
    

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 2012-09-03
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多