我有一个变量,我想用作包含自己的键和数组的哈希的键。
e.g。
custArray = Array.new
custArray << {"c1001" => {"purchases" => ["prod01"]}}
我希望能够做到这样的事情:
if custArray[:c1001].exists?
custArray[{:c1001["purchases"]} << "prod02"]
end
但我只是完全卡住了。
答案 0 :(得分:3)
您可以使用以下方法解决问题:
if c = custArray.find { |h| h.key? 'c1001' }
c.dig('c1001', 'purchases') << "prod2"
end
或者,如果您使用此键可以获得多个结果:
custArray.select { |h| h.key? 'c1001' }.each do |c|
c.dig('c1001', 'purchases') << "prod2"
end
答案 1 :(得分:2)
您可以使用哈希数组中的select来查看密钥是否存在:
target = custArray.find { |h| h.key? 'c1001' }
target['c1001']['purchases'] << "prod02" unless target.nil?
或者,如果数组包含多个具有相同键的哈希值:
custArray.select { |h| h.key? 'c1001' }.each do |h|
h['c1001']['purchases'] << "prod02"
end
答案 2 :(得分:2)
如果您只想更新阵列的第一个实例,您可以这样做:
target = custArray.find { |hash| hash.key? 'c1001' }
target['c1001']['purchases'] << 'prod02' if target
如果要更新阵列的所有实例(反斜杠仅用于控制台目的):
custArray \
.select { |hash| hash.key? 'c1001' } \
.each { |hash| hash['c1001']['purchases'] << 'prod02' }
答案 3 :(得分:1)
此外,您可以编写与您已提供的代码类似的内容
custArray.each do |h|
h['c1001']['purchases'] << 'prod02' if h.keys.include?('c1001')
end
这允许减少迭代循环的次数
答案 4 :(得分:0)
custArray.find { |h| h.key?('c1001') }&.dig('c1001', 'purchases')&.push("prod02")
#=> ["prod01", "prod02"]
custArray
#=> [{"c1001"=>{"purchases"=>["prod01", "prod02"]}}]
custArray.find { |h| h.key?('c1002') }&.dig('c1002', 'purchases')&.push("prod02")
#=> nil
custArray
#=> [{"c1001"=>{"purchases"=>["prod01"]}}]
custArray.find { |h| h.key?('c1001') }&.dig('c1001', 'popsicles')&.push("prod02")
#=> nil
custArray
#=> [{"c1001"=>{"purchases"=>["prod01"]}}]
&
是Ruby的Safe Navigation Operator。另请参见Hash#dig。两者都在Ruby v2.3中首次亮相。