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

ing*_*ala 98 ruby arrays

映射语法:

a = ["a", "b", "c", "d"]      #=> ["a", "b", "c", "d"] 
a.map {|item|"a" == item}     #=> [true, false, false, false] 
a.select {|item|"a" == item}  #=> ["a"]
Run Code Online (Sandbox Code Playgroud)

如果我有问题怎么样:

 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"}
Run Code Online (Sandbox Code Playgroud)

我想删除此数组上具有空qty值的每个条目,或者只选择其中具有某个值的条目.

我试过了:

details.map {|item|"" == item}
Run Code Online (Sandbox Code Playgroud)

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

[]
Run Code Online (Sandbox Code Playgroud)

Emi*_*ily 119

它看起来像是details一系列哈希.所以item你的块内部将是整个哈希.因此,要检查:qty密钥,您需要执行以下操作:

details.select{ |item| item[:qty] != "" }
Run Code Online (Sandbox Code Playgroud)

这将为您提供:qty密钥不是空字符串的所有项目.

官方选择文件


Nik*_* B. 25

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

details.reject { |item| item[:qty].empty? }
Run Code Online (Sandbox Code Playgroud)

内部数据结构本身不是数组,而是哈希.您也可以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"}
Run Code Online (Sandbox Code Playgroud)

或者使用reject,它是反向的select(排除给定条件所持有的所有项目):

h.reject { |key, value| value.empty? }
Run Code Online (Sandbox Code Playgroud)

请注意,这是Ruby 1.9.如果你必须保持与1.8的兼容性,你可以这样做:

Hash[h.reject { |key, value| value.empty? }]
Run Code Online (Sandbox Code Playgroud)


Mic*_*ski 9

处理哈希时{},使用键内部的键和值||.

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

=>[false, false, true, false, false]
Run Code Online (Sandbox Code Playgroud)