-2

データベースにクエリを実行すると、ハッシュの配列が得られました。ハッシュのキーは列名です。複数(3列)に従って一意のハッシュ(配列要素)のみを保持したい。私が試してみました:

array.uniq { |item| item[:col1], item[:col2], item[:col3] }

としても

array = array.inject([{}]) do |res, item|
    if !res.any? { |h| h[:col1] == item[:col1] && 
                       h[:col2] == item[:col2] && 
                       h[:col3] == item[:col3] }
        res << item
    end
end

何が間違っているのか、またはこれについて別の方法を考えている人はいますか?

ありがとう

4

2 に答える 2

0

あなたが何を求めているのか私には不明です。私の最善の推測は、単一関連ハッシュの配列を考えると、次のようになります。

array = [{:col1 => 'aaa'}, {:col2 => 'bbb'}, {:col3 => 'aaa'}]

ハッシュ値ごとに 1 つのハッシュのみを使用したい場合。つまり、最後のハッシュと最初のハッシュの両方に'aaa'値があるため、最後のハッシュを削除します。もしそうなら、これは:

array.uniq{|item| item.values.first}
# => [{:col1=>"aaa"}, {:col2=>"bbb"}]

あなたが望むことをします。

私が想像している他の可能性は、次のような配列が与えられたということです:

array2 = [{:col1 => 'a', :col2 => 'b', :col3 => 'c', :col4 => 'x'},
          {:col1 => 'd', :col2 => 'b', :col3 => 'c', :col4 => 'y'},
          {:col1 => 'a', :col2 => 'b', :col3 => 'c', :col4 => 'z'}]

:col1:col2、および:col3の値が最初のハッシュと同じであるため、最後のハッシュを除外したいと考えています。もしそうなら、これは:

array2.uniq{|item| [item[:col1], item[:col2], item[:col3]]}
# => [{:col1=>"a", :col2=>"b", :col3=>"c", :col4=>"x"},
#     {:col1=>"d", :col2=>"b", :col3=>"c", :col4=>"y"}]

あなたが望むことをします。

これらの推測のどちらも実際に探しているものではない場合は、求めているものを明確にする必要があります。できれば、サンプル入力と目的の出力を含めてください。

また、提示されていない多くの要因によっては、データベース クエリ レベルで目的を達成できる可能性が十分にあることも指摘しておきます。

于 2013-06-03T18:19:06.497 に答える