Ruby 数组: select()、 Collection()和 map()

映射的语法:

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}

只是返回大量的 false,然后当我使用相同的只是更改映射选择我得到:

[]
186131 次浏览

When dealing with a hash {}, use both the key and value to the block inside the ||.

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


=>[false, false, true, false, false]

编辑: 我刚刚意识到您需要过滤 details,它是一个散列数组。在这种情况下,你可以做

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

内部数据结构本身不是 Array,而是 Hash。您也可以在这里使用 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"}

或者使用与 select相反的 reject(不包括给定条件所包含的所有项) :

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

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

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

看起来 details是一个散列数组。所以块内的 item将是整个散列。因此,要检查 :qty键,需要执行以下操作:

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

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

官方特选文件