簡體   English   中英

在 ruby​​ 中遞歸嵌套散列中的鍵值對

[英]Nesting a key value pair in a hash recursively in ruby

我想在深度嵌套的散列中插入 uuid,我正在尋找在 Ruby 中執行此操作的方法。 以下代碼顯示了我在 PHP 中用於此任務的函數:

function insert_uuids(&$array)
{
    if (!is_object($array) && !is_array($array)) {
        return;
    }

    if (is_object($array)) {
        $array->_uid = rand();
    }

    foreach ($array as &$subarray) {
        $this->insert_uuids($subarray);
    }
}

$this->insert_uuids($json);

// Gives me following result:
{
    "component": "root",
    "_uid": "3241242",
    "body": [
        {
            "component": "headline",
            "text": "42323",
            "_uid": "343214556"
        }
    ]
}

我找到了解決方案。

my_hash = {
    :title => "Home",
    :layout => "body--rimless",
    :content => {
        :sections => [
            {
                :component => "section",
                :style => "section--headed"
            }
        ]
    }
}

def insert_uuids(node)
  if node.is_a?(Hash)
    node[:_uid] = rand(100..9999)
    node.each do |k,v|
      if v.is_a?(Array)
        v.each do |elm|
          insert_uuids(elm)
        end
      elsif v.is_a?(Hash)
        insert_uuids(v)
      end
    end
  end
  return node
end

puts insert_uuids(my_hash)

# {:title=>"Home", :layout=>"body--rimless", :content=>{:sections=>[{:component=>"section", :style=>"section--headed", :_uid=>9639}], :_uid=>570}, :_uid=>4972}

要點中的 Ruby 示例存在一些問題:

  • json變量既不是 JSON 字符串也不是有效的 Ruby Hash
  • 沒有參數就不用空括號
  • 不需要檢查is_a?(Hash)is_a?(Array) ,因為insert_uuids方法只定義在Hash

我會從這樣的事情開始:

json = '{ "component": "root", "body": [{ "component": "headline", "text": "42323" }] }'

class Hash
  def insert_uuids
    subarrays = values.select { |value| value.is_a?(Array) }
    subarrays.each do |array|
      array.each do |element|
        element.insert_uuids if element.respond_to?(:insert_uuids)
      end
    end

    update('_uid' => 'some random uid')
  end
end

require 'json'
hash = JSON.parse(json)
hash.insert_uuids
#=> {"component"=>"root", "body"=>[{"component"=>"headline", "text"=>"42323", "_uid"=>"some random uid"}], "_uid"=>"some random uid"}

暫無
暫無

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

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