循环使用符号比较哈希到数组

时间:2015-05-17 06:01:59

标签: arrays ruby hash symbols

我正在尝试将哈希的键与数组的内容进行比较。如果匹配,我希望从哈希中删除该项。

allocate = {:item1=>[1, 1], :item2=>[1, 2], :item3=>[1, 3]}

bad = [:item2, :item4] 

这很有效:

allocate.tap{ |h| h.delete(:item1)}
allocate
=> {:item2=>[1, 2], :item3=>[1, 3]}

如果我从“bad”数组中调用一个值,则值将作为字符串返回,而不是作为符号返回。

bad[1]
=> "item4" 

循环也会发生这种情况:

bad.each do |bad|
  allocate.tap{ |h| h.delete(bad)}
  puts bad
end

=> "item2"
=> "item4"

allocate
=> {:item1=>[1, 1], :item2=>[1, 2], :item3=>[1, 3]}

出于性能原因,我想将哈希键和数组保留为符号。我需要做什么来访问“坏”数组并将项目保留为符号,以便我可以正确地将它与分配哈希进行比较?

我正在使用Ruby v 2.1.3p242。

2 个答案:

答案 0 :(得分:2)

allocate = {:item1=>[1, 1], :item2=>[1, 2], :item3=>[1, 3]}   
bad = [:item2, :item4]

bad.each {|k| allocate.delete(k) }
allocate # => {:item1=>[1, 1], :item3=>[1, 3]}

“坏”值是符号。使用p进行检查。

p bad[0] # prints => :item2
p bad[1] # prints => :item4

不要使用puts进行调试,因为它在打印前将符号转换为字符串

答案 1 :(得分:0)

您可以使用to_sym将字符串翻译成符号。顺便说一下,没有必要使用tap

bad.each { |key| allocate.delete(key.to_sym) }

或者:

allocate.delete_if { |key, _| bad.map(&:to_sym).include?(key) }