任何人都可以解釋為什么會這樣嗎?我希望集合忽略 nil 結果,并且只收集那些符合include?. 第一個和第三個結果條目,我希望不會出現。出于某種原因,它們確實包括在內。我究竟做錯了什么?
f = [
{"title"=>"Tuesday: Cloudy. High plus 12.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}},
{"title"=>"Tuesday night: Cloudy. High plus 2.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}},
{"title"=>"Wednesday: Cloudy. High plus 10.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}},
{"title"=>"Tuesday night: Cloudy. High plus 2.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}}
]
conditions = f.collect { |i| i['title'] if i['title'].include?('night') }
==> [nil, "Tuesday night: Cloudy. High plus 2.", nil, "Tuesday night: Cloudy. High plus 2."]
uj5u.com熱心網友回復:
這是預期的行為 -map將陣列一對一轉換為以下形式的任何陳述句:
do_sth if some_condition
nil當某些條件為假并且與nil其他任何條件一樣只是一個物件時回傳。
處理此問題的標準方法是使用selectbefore 呼叫 map 或呼叫compactafter map。
從 ruby?? 2.7 開始,我們有另一種方法將兩者結合起來:filter_map忽略回傳的虛假值:
conditions = f.filter_map { |i| i['title'] if i['title'].include?('night') }
==> ["Tuesday night: Cloudy. High plus 2.", "Tuesday night: Cloudy. High plus 2."]
uj5u.com熱心網友回復:
因為在每次迭代中, collect/map 都會回傳一些東西(在這種情況下也是 nil )......
您可以使用 select 來過濾您的陣列。像這樣的東西:
f.select { |i| i['title'].include?('night') }.collect {|i| i['title']}
uj5u.com熱心網友回復:
#map將一個集合轉換為另一個相同大小的集合。如果塊回傳nil值,那么這些nils 將在新集合中結束。
如果標題不包含night,i['title'] if i['title'].include?('night')則會回傳like 陳述句。nil
您可以使用#filter_map, #select #map,#inject或#each_with_object
我運行了一個快速的微基準測驗,令人驚訝的是兩次迭代集合(使用#selectAND #map)并不慢。
items = [
{"title"=>"Tuesday: Cloudy. High plus 12.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}},
{"title"=>"Tuesday night: Cloudy. High plus 2.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}},
{"title"=>"Wednesday: Cloudy. High plus 10.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}},
{"title"=>"Tuesday night: Cloudy. High plus 2.",
"link"=>{"type"=>"text/html",
"href"=>"https://www.weather.gc.ca/city/pages/mb-42_metric_e.html"}}
]
require "benchmark/ips"
Benchmark.ips do |x|
x.compare!
x.report("filter_map") do
items.filter_map { |item| item["title"] if item["title"].include?("night")}
end
x.report("select_map") do
items.select { |item| item["title"].include?("night") }.map { |item| item["title"] }
end
x.report("each_with_object") do
items.each_with_object([]) { |item, accu| accu << item["title"] if item["title"].include?("night"); nil }
end
x.report("inject") do
items.inject([]) { |accu, item| accu << item["title"] if item["title"].include?("night"); accu }
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323211.html
