Ruby创建了一个哈希数组

时间:2018-05-07 15:01:06

标签: ruby

我有一个变量,我想用作包含自己的键和数组的哈希的键。

e.g。

custArray = Array.new
custArray << {"c1001" => {"purchases" => ["prod01"]}}

我希望能够做到这样的事情:

if custArray[:c1001].exists?
  custArray[{:c1001["purchases"]} << "prod02"]
end

但我只是完全卡住了。

5 个答案:

答案 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中首次亮相。