簡體   English   中英

當哈希為空時,如何遍歷哈希數組?

[英]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.

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