【问题标题】:Adding values to array hash ruby at a specific position在特定位置向数组哈希 ruby​​ 添加值
【发布时间】:2020-12-09 16:36:34
【问题描述】:

我有一个看起来像这样的哈希响应对象:

jsonResponse = {:json=>{"reply"=>[{"person"=>"abc", "roll_no"=>"1234", "location"=>"loc1", "score"=>"1"}, {"person"=>"def", "roll_no"=>"1235", "location"=>"loc2", "score"=>"2"},{"person"=>"fgh", "roll_no"=>"1236", "location"=>"loc3", "score"=>"3"}]}, :status=>200}

我必须在每个回复数组对象中添加一个键值对在特定位置,以便响应转换为类似的东西,为了现在更简单,让我们尝试添加特定位置的 samke 键值对:

jsonResponse = {:json=>{"reply"=>[{"person"=>"abc", "roll_no"=>"1234","location"=>"loc1", "new_value => "new_result", "score"=>"1"}, {"person"=>"def", "roll_no"=>"1235", "location"=>"loc2","new_value => "new_result", "score"=>"2"},{"person"=>"fgh", "roll_no"=>"1236", "location"=>"loc3", "new_value => "new_result", "score"=>"3"}]}, :status=>200}

这是我尝试过的,我通过 jsonResponse 运行 .each :

jsonResponse[:json]['reply'].each do |object|
               objectArray = object.to_a
               insert_at = objectArray.index(objectArray.assoc('score'))
               object = Hash[objectArray.insert(insert_at, ['new_value','new_result'])]
               print("\n\nTest\n\n")
               print object
      end
    print("\n\nFinal Response\n\n")
    print jsonResponse

我正在打印的 object 具有所需的响应,但它没有在 jsonResponse 中得到更新

这是上面代码sn-p的输出:


Test

{"person"=>"abc", "roll_no"=>"1234", "location"=>"loc1", "new_value"=>"new_result", "score"=>"1"}

Test

{"person"=>"def", "roll_no"=>"1235", "location"=>"loc2", "new_value"=>"new_result", "score"=>"2"}

Test

{"person"=>"fgh", "roll_no"=>"1236", "location"=>"loc3", "new_value"=>"new_result", "score"=>"3"}

Final Response

{:json=>{"reply"=>[{"person"=>"abc", "roll_no"=>"1234", "location"=>"loc1", "score"=>"1"}, {"person"=>"def", "roll_no"=>"1235", "location"=>"loc2", "score"=>"2"}, {"person"=>"fgh", "roll_no"=>"1236", "location"=>"loc3", "score"=>"3"}]}, :status=>200}

Q2. 从代码 sn-p 中也可以看出,insert_at 逻辑的工作方式是在位置之前添加我们指定,例如它在 score key 之前添加,是否有我可以编写的逻辑添加到指定 key 之后而不是之前的 位置?

感谢大家的努力

【问题讨论】:

  • 哈希仅按插入排序...仅应影响迭代的顺序。因此,您将不得不删除所有内容并重新插入,或者读取并创建一个新的哈希值。请问这个练习的目的是什么?如果您稍后在数据传输中通过索引位置访问哈希/json,您应该查看新的访问方式。
  • @benjessop,我从我的 api 中的服务回复中接收到 jsonResponse,我已经根据特定用例发布了 sn-p,我对不同的读取 jsonResponse 的方式持开放态度,但我有根据一个特别存在的键插入键值对
  • 您应该注意,尽管自 Ruby 1.9 起保留了散列项的插入顺序,但在 JSON 标准和许多其他支持散列模式的语言中没有这样的限制。在 JSON 中,对象中属性的顺序未指定且不应依赖。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

我们得到了三个对象。

jsonResponse = {
  :json=>{
    "reply"=>[
      {"person"=>"abc", "roll_no"=>"1234", "location"=>"loc1", "score"=>"1"},
      {"person"=>"def", "roll_no"=>"1235", "location"=>"loc2", "score"=>"2"}, 
      {"person"=>"fgh", "roll_no"=>"1236", "location"=>"loc3", "score"=>"3"}
    ]
  },
  :status=>200
}

key_value_pair_to_add = { 'new_value'=>'new_result' }
key_to_precede = 'location'

然后我们修改jsonResponse如下。

keys_to_shift = jsonResponse[:json]['reply'][0].keys.
  drop_while { |k| k != key_to_precede }        
  #=> ["location", "score"]
jsonResponse[:json]['reply'].each do |h| 
  h.update('new_value'=>'new_result')
  keys_to_shift.each { |k| h.update(k=>h.delete(k)) }
end
jsonResponse
  #=> {
  #     :json=>{
  #       "reply"=>[
  #         {"person"=>"abc", "roll_no"=>"1234", "new_value"=>"new_result",
  #          "location"=>"loc1", "score"=>"1"},
  #         {"person"=>"def", "roll_no"=>"1235", "new_value"=>"new_result",
  #          "location"=>"loc2", "score"=>"2"},
  #         {"person"=>"fgh", "roll_no"=>"1236", "new_value"=>"new_result",
  #          "location"=>"loc3", "score"=>"3"}
  #       ]
  #     },
  #     :status=>200
  #   }

Hash#update(又名merge!)和Hash#delete

h.delete('location')

h中移除键值对'location'=>'locX'并返回locX,之后

h.update('location'=>'locX')

将该键值对返回到哈希的末尾。对keys_to_shift 中的每个键重复此操作。

【讨论】:

    【解决方案2】:

    举个简单的例子:

    # define order 
    order = [:first, :second, :third]
    # the hash you want to order by
    json = { :third=>"3", :second=>2, :first=>1 }
    
    result = json.sort_by { |k, _| order.index(k) }.to_h
    

    那么结果将是{:first=>1, :second=>2, :third=>"3"}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2018-02-17
      • 2016-02-10
      • 2012-01-07
      • 2021-02-05
      • 1970-01-01
      相关资源
      最近更新 更多