0

各ハッシュの特定のキーに基づくハッシュの配列のグループが必要です。たとえば、次のようにします。

[
    [0] {
        :status => "pending",
             :x => 1,
             :y => 2
    },
    [1] {
        :status => "pending",
             :x => 33,
             :y => 74
    },
    [2] {
        :status => "done",
             :x => 33,
             :y => 74
    }
]

これを次のように変換する必要があります。

{
    "pending" => [
        [0] {
            :status => "pending",
                 :x => 1,
                 :y => 2
        },
        [1] {
            :status => "pending",
                 :x => 33,
                 :y => 74
        }
    ],
       "done" => [
        [0] {
            :status => "done",
                 :x => 33,
                 :y => 74
        }
    ]
}

:status キーで配列をグループ化しています。私はこれを行いました(動作します):

a.inject({}) {|a, b| (a[b[:status]] ||= []) << b; a }

しかし、同じことを行うことができる、より単純でわかりにくいワンライナーはありますか?

4

2 に答える 2

1

組み込みの記述メソッドを保証するほど一般的な操作ではありませんが、行を少し調整します。

を使用する代わりに#inject()#each_with_object()? それはまさにそれが行うことなので、反復で同じオブジェクトを渡すのにより適しています-「注入」、IMOよりも説明的でもあります。

これには、ブロックの最後から を削除するという追加の利点が; aあります。これは、各反復間で同じオブジェクトを渡すために inject を使用する際の問題です。したがって、最終行は次のようになります (変数名を微調整します)。

ary.each_with_object({}) {|e, obj| (obj[e[:status]] ||= []) << e }

each_with_object の戻り値は構築中のハッシュであるため、上記を変数に割り当てるか、メソッドから返すことができます。

最後に、アプリケーションでより説明的にしたい場合は、その行を説明的なメソッドでラップします

def index_with_status(ary)
    ary.each_with_object({}) {|e, obj| (obj[e[:status]] ||= []) << e }
end
于 2013-04-10T08:17:24.597 に答える