Ruby create an array of hashes
Clash Royale CLAN TAG#URR8PPP
Ruby create an array of hashes
I've got a variable I'd like to use as a key to a hash that contains its own key and array.
e.g.
custArray = Array.new
custArray << "c1001" => "purchases" => ["prod01"]
I want to be able to do something like:
if custArray[:c1001].exists?
custArray[:c1001["purchases"] << "prod02"]
end
but I'm just totally stuck.
cust_array
custArray
I suggest that in future you not be in such a rush to select an answer. There's no hurry.
– Cary Swoveland
May 7 at 18:02
5 Answers
5
You can resolve it with:
if c = custArray.find
c.dig('c1001', 'purchases') << "prod2"
end
Or if you can have more than one result with this key:
custArray.select .each do |c|
c.dig('c1001', 'purchases') << "prod2"
end
If you only want to update the first instance of the array you can do:
target = custArray.find hash
target['c1001']['purchases'] << 'prod02' if target
If you want to update all instances of the array you can do (backslashes are for console purposes only):
custArray
.select hash
.each hash
You can use select from the array of hashes to see if the key is there:
target = custArray.find
target['c1001']['purchases'] << "prod02" unless target.nil?
Or if array contains multiple hashes with the same key:
custArray.select .each do |h|
h['c1001']['purchases'] << "prod02"
end
Apologies, I edited the question. That absolutely worked.
– Toph
May 7 at 15:13
I edited my answer as the first answer I gave was incorrect
– lacostenycoder
May 7 at 15:15
See last update. But also be aware, an array may contain multiple hashes that have the same keys. So make sure however you're building your array, those keys are unique. Also prefer snake case in ruby
cust_array
vs custArray
.– lacostenycoder
May 7 at 15:29
cust_array
custArray
That did the trick! Thanks so much!
– Toph
May 7 at 15:29
Also, you can write something similar to code that you already provide
custArray.each do |h|
h['c1001']['purchases'] << 'prod02' if h.keys.include?('c1001')
end
That allows reducing the count of iteration loops
This solution will also handle if you have duplicate array values with the same hash key
c1001
– lacostenycoder
May 7 at 15:41
c1001
custArray.find h&.dig('c1001', 'purchases')&.push("prod02")
#=> ["prod01", "prod02"]
custArray
#=> ["c1001"=>"purchases"=>["prod01", "prod02"]]
custArray.find h.key?('c1002') &.dig('c1002', 'purchases')&.push("prod02")
#=> nil
custArray
#=> ["c1001"=>"purchases"=>["prod01"]]
custArray.find h&.dig('c1001', 'popsicles')&.push("prod02")
#=> nil
custArray
#=> ["c1001"=>"purchases"=>["prod01"]]
&
is Ruby's Safe Navigation Operator. See also Hash#dig. Both made their debut in Ruby v2.3.
&
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Prefer
cust_array
overcustArray
in Ruby. Also, "c1001" and :c1001 are not equivalent hash keys.– yzalavin
May 7 at 15:11