1

Ruby onRails3.2.2とRuby1.9.3を使用しています。Hash2つのes(Aと)を比較して、 ( )に他の( )のすべてのキー/値が含まれている場合Bに返すようにします。trueHashAHashB

たとえば、私が持っているとすると

params.inspect
# => { "action"=>"...", "controller"=>"...", "key_param1"=>"value_param1", , "key_param2"=>"value_param2", "key_param3"=>"value_param3", ... }

my_hash1.inspect
# => { "key_param1"=>"value_param1", "key_param2"=>"value_param2" }

my_hash2.inspect
# => { "key_param4"=>"value_param4", "key_param1"=>"value_param1" }

my_hash3.inspect
# => {}

それから私は作るための方法(またはそのようなもの)を探しています

params.has_same_keys_and_values_as?(my_hash1)
# => true

params.has_same_keys_and_values_as?(my_hash2)
# => false

params.has_same_keys_and_values_as?(my_hash3)
# => true
4

5 に答える 5

1

私はあなたが使うことができると思います:

a.slice(*b.keys) == b

ここで、aとbはハッシュです。スライスはRailsメソッドであり、Rubyではないことに注意してください。プレーンルビーでは、次のように書くことができます。

a.keep_if{|k, v| b[k]} == b
于 2012-08-02T07:24:51.757 に答える
1

Hash#keys と Hash#values が同じ順序で値を返すと仮定します。

params.values_at(*my_hash.keys) == my_hash.values
于 2012-08-02T07:17:18.270 に答える
0
class Hash
  def >=(b)  
    eq = true
    b.each { |k, v| eq &= !(self.include? k) ? false : ( ( ((self[k]&&v).is_a? Hash) && !((v||self[k]).empty?) ) ? self[k]>=v : true)}

    return eq
  end

end
params = { "action"=>"...", "controller"=>"...", "key_param1"=>"value_param1", "key_param2"=>"value_param2", "key_param3"=>"value_param3" }
my_hash1 = { "key_param1"=>"value_param1", "key_param2"=>"value_param2" }
my_hash2 = { "key_param4"=>"value_param4", "key_param1"=>"value_param1" }
my_hash3 = {}

p params >= my_hash1 #true
p params >= my_hash2 #false
p params >= my_hash3 #true

「深い」ハッシュでも機能します。

b = {1 => {2 => {} }, 4 => {} }
a = {1 => {2 => {3 => {} }}, 4 => {}, 5 => "123" }

p a >= b #true
p b >= a #false

PS
1 つのハッシュに別のハッシュが含まれているかどうか

于 2012-08-02T12:55:05.453 に答える
0

編集:これは、値/キーが両方のハッシュで同じ順序ではないことを前提としています。

hash1 の各キーを反復処理して、has_key? を使用できますか? ハッシュ2で。これは単純なソリューションであり、大規模なデータセットでは遅くなる可能性があることに注意してください。

チェックアウト has_key? と has_value? ここ: http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-has_key-3F

次のようにループできます。

hash1.each_key { |key|
    if hash2.has_key?(key)
        do whatever
    endif
}
于 2012-08-02T07:18:00.873 に答える
0

より良い方法は、これに対するアクティブなサポート メソッド、hash.diff があり、それを .empty でラップすることです。それらが同じかどうかを確認するには

{:one => 1}.diff({:one => 1}).empty?

=> true

{:one => 1}.diff({:one => 2}).empty?

=> false

http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Diff.html

于 2012-09-11T20:02:22.687 に答える