Ruby数组:select(),collect()和map()


106

映射语法:

a = ["a", "b", "c", "d"]      #=> ["a", "b", "c", "d"] 
a.map {|item|"a" == item}     #=> [true, false, false, false] 
a.select {|item|"a" == item}  #=> ["a"]

询问我是否有:

 irb(main):105:0> details[1]
 => {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", 
 :qty2=>"1", :price=>"5,204.34 P"}

我想删除此数组上具有空数量值的每个条目,或仅选择其中具有某些值的条目。

我试过了:

details.map {|item|"" == item}

只是返回很多错误,然后当我使用相同的只是更改地图以选择我得到:

[]

如果仔细看,它看起来像是散列的数组
Emily

@Emily:是的,我才意识到。上一个代码示例使我觉得:qty不一样,因为它甚至没有出现在这里。
Niklas B.

Answers:


131

看起来像是details散列数组。因此item,您的块中将是整个哈希。因此,要检查:qty密钥,您需要执行以下操作:

details.select{ |item| item[:qty] != "" }

这将为您提供所有:qty键不是空字符串的项目。

官方选择文件


26

编辑:我刚刚意识到你想过滤details,这是一个哈希数组。在这种情况下,您可以

details.reject { |item| item[:qty].empty? }

内部数据结构本身不是数组,而是哈希。您也可以select在这里使用,但是在这种情况下,为块提供了键和值:

irb(main):001:0> h = {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", :qty2=>"1", :price=>"5,204.34 P"}
irb(main):002:0> h.select { |key, value| !value.empty? }
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", 
    :qty2=>"1", :price=>"5,204.34 P"}

或使用reject,这是的倒数select(不包括给定条件所适用的所有项目):

h.reject { |key, value| value.empty? }

请注意,这是Ruby 1.9。如果必须保持与1.8的兼容性,则可以执行以下操作:

Hash[h.reject { |key, value| value.empty? }]

@ingalcala:我刚刚意识到我的答案实际上并不是您所需要的。请检查我的编辑内容,以了解如何过滤details数组本身。
Niklas B.

9

处理散列时{},请将关键字和值都使用到||

details.map {|key,item|"" == item}

=>[false, false, true, false, false]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.