[解決済み] Rubyでnil値をマッピングして削除する方法
2022-02-11 14:43:40
質問
を持っています。
map
これは、値を変更するか、またはnilに設定します。そして、リストからnilのエントリーを削除したい。リストは保持する必要はありません。
現在、私が持っているのはこれです。
# A simple example function, which returns a value or nil
def transform(n)
rand > 0.5 ? n * 10 : nil }
end
items.map! { |x| transform(x) } # [1, 2, 3, 4, 5] => [10, nil, 30, 40, nil]
items.reject! { |x| x.nil? } # [10, nil, 30, 40, nil] => [10, 30, 40]
このようにループして条件付きで別の配列に集めればいいのは承知しています。
new_items = []
items.each do |x|
x = transform(x)
new_items.append(x) unless x.nil?
end
items = new_items
でも、そんなイディオム的なものではなさそうです。リスト上の関数をマッピングして、nilを削除したり除外したりする良い方法はないでしょうか?
どのように解決するのですか?
Ruby 2.7+
今ならあります!
Ruby 2.7で導入されるのは
filter_map
この目的のために 慣用的でパフォーマンスも高いので、すぐに標準になると思います。
例えば、こんな感じです。
numbers = [1, 2, 5, 8, 10, 13]
enum.filter_map { |i| i * 2 if i.even? }
# => [4, 16, 20]
あなたの場合、ブロックがfalseyと評価されるように、単に。
items.filter_map { |x| process_x url }
" Ruby 2.7 では Enumerable#filter_map が追加されました。 この問題に対する初期のアプローチに対するパフォーマンス・ベンチマークを含む、この問題に関する良い読み物です。
N = 100_000
enum = 1.upto(1_000)
Benchmark.bmbm do |x|
x.report("select + map") { N.times { enum.select { |i| i.even? }.map{ |i| i + 1 } } }
x.report("map + compact") { N.times { enum.map { |i| i + 1 if i.even? }.compact } }
x.report("filter_map") { N.times { enum.filter_map { |i| i + 1 if i.even? } } }
end
# Rehearsal -------------------------------------------------
# select + map 8.569651 0.051319 8.620970 ( 8.632449)
# map + compact 7.392666 0.133964 7.526630 ( 7.538013)
# filter_map 6.923772 0.022314 6.946086 ( 6.956135)
# --------------------------------------- total: 23.093686sec
#
# user system total real
# select + map 8.550637 0.033190 8.583827 ( 8.597627)
# map + compact 7.263667 0.131180 7.394847 ( 7.405570)
# filter_map 6.761388 0.018223 6.779611 ( 6.790559)
関連
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] Rubyでランダムな文字列を生成する方法
-
[解決済み] JanusのセットアップにVIMプラグインを追加する
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyで文字列を小文字・大文字に変換する方法
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] RVM (Ruby Version Manager) をシステムから削除する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rubyで新しい文字列を作成せずに文字列をトリミングする標準的な方法は何ですか?
-
[解決済み] Ruby プログラムに一定時間待つように指示する
-
[解決済み] git, Heroku: pre-receive フックの減少
-
[解決済み] Ruby Detect方式
-
[解決済み] Ruby Net::HTTPの実行期限が切れた
-
[解決済み] ネストされたクラスとモジュールにネストされたクラスはいつ使用するのですか?
-
[解決済み] Rubyでfailキーワードは何をするのですか?
-
[解決済み] Railsアプリでhttpartyを使用して基本認証を使用するには?
-
ERRORの問題を解決します。rails のインストール時に gem ネイティブ拡張のビルドに失敗しました。
-
[解決済み】配列から空白の要素を削除するにはどうすればいいですか?