【问题标题】:Checking for nil value inside collect function在 collect 函数中检查 nil 值
【发布时间】:2014-03-28 15:12:17
【问题描述】:

我有一个哈希数组,如下所示。假设我的数组是@fruits_list:

[
    {:key_1=>15, :key_2=>"Apple"}, 
    {:key_1=>16, :key_2 =>"Orange"}, 
    {:key_1=>17, :key_2 =>" "}
]

我想使用 '|' 加入散列中的值;但我的最终输出不应包含 nil 值。我使用以下方式连接它:

@fruits_list.collect { |hsh| hsh[:key_2] }.join("|")

但这会在我的输出中添加 nil,所以我的最终输出有 3 个项目 {"Apple" | “橙色” | “”}。我想要列表中的 2 项,并想消除 nil 值,所以我的最终输出应该看起来像 {"Apple" | “橙色”}。

我试过了:@fruits_list.collect { |hsh| hsh[:key_2] unless hsh[:key_2].nil? }.join("|"),但即便如此,最终输出中也会返回 3 个项目。我做错了什么或如何消除 nil 值?

【问题讨论】:

  • 那不是nil 值,它是space
  • 除非 hsh[:key_2].blank?会做你想做的。正如 Bala 所说, nil 行不通

标签: ruby-on-rails ruby collect


【解决方案1】:

您可以使用以下方法过滤非空白值:

a.collect{ |h| h[:key_2] }.select(&:present?).join('|')

present? 方法返回true 仅当事物足够“非空白”,即空字符串、由空格组成的字符串、空数组、空哈希都被视为空白。

【讨论】:

  • 在红宝石中我们不能使用现在吗?带字符串的方法。
  • @AlokAnand 该问题使用 Ruby on Rails 进行标记,因此应将 present? 定义为 ActiveSupport 的一部分。
【解决方案2】:
a = [
    {:key_1=>15, :key_2=>"Apple"}, 
    {:key_1=>16, :key_2 =>"Orange"}, 
    {:key_1=>17, :key_2 =>" "}
]

a.collect{ |hsh| hsh[:key_2] unless hsh[:key_2] =~ /\s+/}.compact.join("|")

#=> "Apple|Orange"

【讨论】:

  • 你能详细说明你的答案吗?
  • 试过这个。我没有在输出中得到任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多