以特定顺序将哈希值写入数组

joh*_*ser 0 ruby arrays hash

所以我有一堆看起来像这样的哈希

{
 "key1"=>"value1", 
 "key2"=>"value2", 
 "key4"=>"value4"
}

{
 "key1"=>"value1", 
 "key3"=>"value3", 
 "key4"=>"value4"
}
Run Code Online (Sandbox Code Playgroud)

如您所见,并非所有哈希都具有所有键.除此之外,我需要获得一个包含所有值的数组,并使用字符串"Not listed"代替所有缺失值.

我开始写这样的代码:

result = []
i = 0
hash.each do |key, value|
    i+=1
    result << value if key == "key" + i.to_s
end
Run Code Online (Sandbox Code Playgroud)

在我意识到这个策略不起作用之前.有什么建议?

编辑:

第一个哈希的预期输出将是

["value1", "value2", "Not Listed", "value4"]
Run Code Online (Sandbox Code Playgroud)

而对于第二个哈希将是

["value1", "Not Listed", "value3", "value4"]
Run Code Online (Sandbox Code Playgroud)

Uri*_*ssi 6

目前尚不清楚你怎么知道应该有多少键,但假设你应该有4个键,你可以做到以下几点:

h = {
 "key1"=>"value1", 
 "key2"=>"value2", 
 "key4"=>"value4"
}
(1..4).map { |i| h["key#{i}"] || 'Not Listed' }
#=> ["value1", "value2", "Not Listed", "value4"]
Run Code Online (Sandbox Code Playgroud)

Arup提出了不同的风味,使用fetch:

(1..4).map { |i| h.fetch("key#{i}", 'Not Listed') }
#=> ["value1", "value2", "Not Listed", "value4"]
Run Code Online (Sandbox Code Playgroud)

还有另一种选择是使用Hashdefault值:

h.default = 'Not Listed'
(1..4).map { |i| h["key#{i}"] }
#=> ["value1", "value2", "Not Listed", "value4"]
Run Code Online (Sandbox Code Playgroud)