嵌套 Ruby 哈希
Nesting a Ruby hash
我有一种方法可以像这样从我的 table 中选择所有行:
smtp_status_raw = my_table.select(:message, :is_valid, :hostname).map { |h| h.values }
这个 returns 数组是这样的:
[{:message=>"blah", :is_valid=>true, :hostname=>"1"}, {:message=>"blah", :is_valid=>true, :hostname=>"2"}, {:message=>"blah", :is_valid=>true, :hostname=>"3}]
使用以上信息,我想创建一个如下所示的散列:
{
:node_status =>
{
{:hostname => "1", :message: "blah"},
{:hostname => "2", :message: "blah"},
{:hostname => "3", :message: "blah"}
}
}
首先,我的问题 - 是否可以像上面那样创建散列?在上面的示例 Sequel 查询中,我有三个对象,它们是三个独立的主机,我想将这三个主机添加到 :node_status
键中。那可能吗?如果那不是有效的哈希,还有什么替代方法?
其次,这是我尝试过的:
# Initialize the hash
smtp_status_hash = { :node_status: => nil }
我已经用 node_status
键初始化了 smtp_status_hash
散列,但我不确定如何嵌套查询结果..
这不是有效的散列,因为您有 3 个值,但 :node_status
子散列中没有键。你可以这样做:
smtp_status_raw = [
{:message=>"blah", :is_valid=>true, :hostname=>"1"},
{:message=>"blah", :is_valid=>true, :hostname=>"2"},
{:message=>"blah", :is_valid=>true, :hostname=>"3"}
]
{
node_status: smtp_status_raw.collect do |hash|
hash.reject { |key, value| key == :is_valid }
end
}
获取 :node_status
中的值作为数组:
{
:node_status=>[
{:message=>"blah", :hostname=>"1"},
{:message=>"blah", :hostname=>"2"},
{:message=>"blah", :hostname=>"3"}
]
}
或者您可以这样做:
{
node_status: smtp_status_raw.collect do |hash|
[hash[:hostname], hash[:message]]
end.to_h
}
它设置了一个子散列,其中 key
是 :hostname
并且 value
是 :message
:
{
:node_status=>{
"1"=>"blah",
"2"=>"blah",
"3"=>"blah"
}
}
或者如果您想要保留更多密钥:
{
node_status: smtp_status_raw.collect do |hash|
[hash[:hostname], hash.reject { |key, value| key == :is_valid }]
end.to_h
}
这仍然是一个散列,其中 key
是 :hostname
但 value
有另一个散列:
{
:node_status=>{
"1"=>{:message=>"blah", :hostname=>"1"},
"2"=>{:message=>"blah", :hostname=>"2"},
"3"=>{:message=>"blah", :hostname=>"3"}
}
}
要在创建 Hash
后设置键的值,您可以执行以下操作:
smtp_status_hash = { node_status: nil }
smtp_status_hash[:node_status] = "Whatever you want here"
您可以阅读有关 Hash
及其方法的更多信息,以及如何 select
和 reject
从散列中保留或删除键。哈希虽然是字典结构,但必须始终具有 key
和单个 value
,尽管该值可能是 Array
或另一个 Hash
.
试试这个
smtp_status_hash = {:node_status=>[]}; my_table.select(:message, :is_valid, :hostname).map{ |h| h.values }.each{|i| smtp_status_hash[:node_status] << (i)}
我有一种方法可以像这样从我的 table 中选择所有行:
smtp_status_raw = my_table.select(:message, :is_valid, :hostname).map { |h| h.values }
这个 returns 数组是这样的:
[{:message=>"blah", :is_valid=>true, :hostname=>"1"}, {:message=>"blah", :is_valid=>true, :hostname=>"2"}, {:message=>"blah", :is_valid=>true, :hostname=>"3}]
使用以上信息,我想创建一个如下所示的散列:
{
:node_status =>
{
{:hostname => "1", :message: "blah"},
{:hostname => "2", :message: "blah"},
{:hostname => "3", :message: "blah"}
}
}
首先,我的问题 - 是否可以像上面那样创建散列?在上面的示例 Sequel 查询中,我有三个对象,它们是三个独立的主机,我想将这三个主机添加到 :node_status
键中。那可能吗?如果那不是有效的哈希,还有什么替代方法?
其次,这是我尝试过的:
# Initialize the hash
smtp_status_hash = { :node_status: => nil }
我已经用 node_status
键初始化了 smtp_status_hash
散列,但我不确定如何嵌套查询结果..
这不是有效的散列,因为您有 3 个值,但 :node_status
子散列中没有键。你可以这样做:
smtp_status_raw = [
{:message=>"blah", :is_valid=>true, :hostname=>"1"},
{:message=>"blah", :is_valid=>true, :hostname=>"2"},
{:message=>"blah", :is_valid=>true, :hostname=>"3"}
]
{
node_status: smtp_status_raw.collect do |hash|
hash.reject { |key, value| key == :is_valid }
end
}
获取 :node_status
中的值作为数组:
{
:node_status=>[
{:message=>"blah", :hostname=>"1"},
{:message=>"blah", :hostname=>"2"},
{:message=>"blah", :hostname=>"3"}
]
}
或者您可以这样做:
{
node_status: smtp_status_raw.collect do |hash|
[hash[:hostname], hash[:message]]
end.to_h
}
它设置了一个子散列,其中 key
是 :hostname
并且 value
是 :message
:
{
:node_status=>{
"1"=>"blah",
"2"=>"blah",
"3"=>"blah"
}
}
或者如果您想要保留更多密钥:
{
node_status: smtp_status_raw.collect do |hash|
[hash[:hostname], hash.reject { |key, value| key == :is_valid }]
end.to_h
}
这仍然是一个散列,其中 key
是 :hostname
但 value
有另一个散列:
{
:node_status=>{
"1"=>{:message=>"blah", :hostname=>"1"},
"2"=>{:message=>"blah", :hostname=>"2"},
"3"=>{:message=>"blah", :hostname=>"3"}
}
}
要在创建 Hash
后设置键的值,您可以执行以下操作:
smtp_status_hash = { node_status: nil }
smtp_status_hash[:node_status] = "Whatever you want here"
您可以阅读有关 Hash
及其方法的更多信息,以及如何 select
和 reject
从散列中保留或删除键。哈希虽然是字典结构,但必须始终具有 key
和单个 value
,尽管该值可能是 Array
或另一个 Hash
.
试试这个
smtp_status_hash = {:node_status=>[]}; my_table.select(:message, :is_valid, :hostname).map{ |h| h.values }.each{|i| smtp_status_hash[:node_status] << (i)}