[英]How to iterate through an array of hashes when there is a blank hash?
我有一個哈希數組: @grouped_messages
=
[{},
{100=>[#<Message id: 3, content: "Needs more training", from: 100, employee_id: 1>]},
{101=>[#<Message id: 2, content: "Very lazy.", from: 101, employee_id: 2>], 102=>[#<Message id: 1, content: "Fantastic.", from: 102, employee_id: 2>]}]
哈希值之一是空白。
如何遍歷數組並顯示內容而不會導致以下錯誤:
Error (undefined method `any?' for nil:NilClass)
我嘗試了以下操作,但仍然收到錯誤消息:
<% if @grouped_messages.any? %>
<% @grouped_messages.each do |sender, messages| %>
<% if messages.any? %>
<% messages.each do |msg| %>
....
<% end %>
<% end %>
<% end %>
<% end %>
我會過濾以僅保留非空哈希:
@grouped_messages.reject(&:blank?).each ...
您可以像暫停呼吸一樣過濾掉空的哈希。 但是,您的代碼中還有另一個錯誤。
@grouped_messages
是一個哈希數組。 你做不到
@grouped_messages.each do |sender, messages|
在數組上使用.each
產生一個值 ,在您的情況下為哈希值。 因此,您應該執行以下操作:
@grouped_messages.each do |grouped_message|
grouped_message.each do |sender, messages|
# ...
end
end
在您的情況下,您的messages
變量始終為nil
,因為Hash(例如{100=>[ ... ]}
)將存儲在sender
變量中。 因此,即使使用非空的哈希值,它也nil
。
實際上,查看您的數據時,最好將@grouped_messages
為哈希,而將發送者ID和值作為消息列表作為關鍵字。 所以有一個像這樣的結構:
@grouped_messages = {
101 => [ msg1, msg2, ... msgN ],
102 => [ msg1, msg2, ... msgN ]
}
然后就可以進行循環了:
@grouped_messages.each do |sender, messages|
# ...
end
嘗試這個:
<% @grouped_messages.reject(&:blank?).each do |sender, messages| %>
<% messages.each do |msg| %>
# ....
<% end %>
<% end %>
刪除條件
if messages.any?
並將下一行更改為
messages.to_a.each do |msg|
...
使用純Ruby刪除空消息
@grouped_messages.reject(&:empty?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.