meaning - ruby hash==




Ruby: Zerlege einen Hash in zwei basierend auf den gewünschten Schlüsseln (4)

Mit Rails / Active Support können Sie den extract! Methode:

hash = {:a => 1, :b => 2, :c => 3, :d => 4}
keyset = [:a, :c]

hash2 = hash.extract! *keyset
>> {:a=>1, :c=>3}

hash
>> {:b=>2, :d=>4}

Ich hoffe, dass diese Frage eine sehr einfache Antwort hat. Ich kann mir mit langweiligen, nervigen Loopings etwas einfallen lassen, aber ich hoffe, dass es eine elegantere Lösung gibt.

Wenn ich die folgenden zwei Variablen habe:

hash = {:a => 1, :b => 2, :c => 3, :d => 4}
keyset = [:a, :c]

Wie kann ich die folgenden zwei Hashes auf die einfachste Weise erhalten?

hash1 = {:a => 1, :c => 3}
hash2 = {:b => 3, :d => 4}

Wenn das Beispiel mein Ziel nicht klar macht, was ich möchte, ist ein Hybrid zwischen #delete und #delete_if - #delete gibt den gelöschten Wert zurück, während #delete_if mir erlaubt, in großen #delete_if zu löschen. Ich würde einen Weg bevorzugen, in der Masse zu löschen, und die gelöschten Werte zurückzugeben - oder etwas Äquivalent.

Vielen Dank!


Versuchen Sie Active Support mit Hash#slice und / oder Hash#except . Die Bang-Methoden existieren auch:

$ irb
>> require 'active_support/core_ext'
=> true

>> hash = {:a => 1, :b => 2, :c => 3, :d => 4}
=> {:a=>1, :d=>4, :b=>2, :c=>3}
>> keyset = [:a, :c]
=> [:a, :c]

>> remainders = hash.slice!(*keyset)
=> {:d=>4, :b=>2}

>> remainders
=> {:d=>4, :b=>2}
>> hash
=> {:a=>1, :c=>3}

hash = { a: 1, b: 2, c: 3, d: 4 }
keyset = [:a, :c]

left, right = hash.partition {|k,v| keyset.include? k }

Dies lässt links und rechts als Arrays von Arrays; zurück in Hash:

left = Hash[left]
right = Hash[right]

puts "left=#{left.inspect}"
puts "right=#{right.inspect}"

new_hash = {}
keyset.each {|i| new_hash[i] = hash.delete(i)}

Das schien es für mich zu tun, ohne zusätzliche Anforderungen zu stellen





hash