簡體   English   中英

遞增 ruby 中某個鍵的值 json?

[英]Incrementing json value of a key in ruby?

我正在尋找一種方法來增加鍵 foo 和 bar 的值

{
  "users": [
    {
      "foo": 6522
    },
    {
      "bar": 20
    }
  ]
}

這是我嘗試的示例,但結果保持值不變。

data = JSON.parse(filepath\info.json)

puts data["users"][1].values[0] # 20

data["users"][1].values[0] += 5

puts data["users"][1].values[0] # remains 20, but expected 25

還有另一種方法可以增加這些值嗎?

您需要知道增加user的密鑰。 由於有時看起來有所不同,因此您可以通過 2 each s 來實現

data[:users].each {|u| u.keys.each {|k| u[k] += 1 } }

遍歷用戶,然后遍歷用戶 object 中的鍵,加 1。

這假設用戶只有一個密鑰,它是 integer。

values返回一個新數組,因此您將無法以這種方式使用它。

使用 Hash#transform_values!

有多種方法可以做到這一點,但由於您已經擁有數據結構 Hash,對我來說最自然的方法是使用Hash#transform_values! 用於就地修改存儲為 Hash 值的整數。 考慮以下示例,它迭代存儲在hash[:users]中的數組中的 Hash 個對象並遞增每個值:

hash = {:users=>[{:foo=>6522}, {:bar=>20}]}
hash[:users].map { |h| h.transform_values! { |v| v += 1 } }
#=> [{:foo=>6523}, {:bar=>21}]

# @note The changes to your Hash values are made in-place, and
#   are persistent.
hash
#=> {:users=>[{:foo=>6523}, {:bar=>21}]}

需要考慮的注意事項

當然,這種方法只有在您知道以下情況時才有效:users 是您的頂級 Hash 鍵,並且它包含一個 Hash 對象數組,每個對象都有 Integer 值。 如果您的數據結構不一致,或者您不能依賴數組中的 Hash 值為整數,那么您可能需要通過數據結構遞歸或模式匹配來采取更復雜和/或防御性的方法,並且然后在嘗試增加它們之前驗證您的 Hash 值是整數(或將它們轉換為整數)。

我上面提供的解決方案適用於您發布的示例,但肯定會做出一些基本假設。 如果它們對您的數據是安全的假設,那么請試一試!

暫無
暫無

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

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