给定一组可能值和任意数量值的散列,我如何用可能值的所有可能组合替换每个 nil
值?
例如:
values = %w[a b c]
hash = { x:1, y:2, z:nil }
fill_wildcards( hash, values )
#=> [{ x:1, y:2, z:'a' },
#=> { x:1, y:2, z:'b' },
#=> { x:1, y:2, z:'c' }]
hash = { x:1, y:nil, z:nil }
fill_wildcards( hash, values )
#=> [{ x:1, y:'a', z:'a' },
#=> { x:1, y:'a', z:'b' },
#=> { x:1, y:'a', z:'c' },
#=> { x:1, y:'b', z:'a' },
#=> { x:1, y:'b', z:'b' },
#=> { x:1, y:'b', z:'c' },
#=> { x:1, y:'c', z:'a' },
#=> { x:1, y:'c', z:'b' },
#=> { x:1, y:'c', z:'c' }]
我可以找到需要更换的 key :
wildkeys = hash.select{ |k,v| v.nil? }.map(&:first)
#=> [:y, :z]
因此我可以 find all the permutations of values needed :
wildvalues = values.repeated_permutation( wildkeys.length ).to_a
#=> [["a", "a"], ["a", "b"], ["a", "c"], ["b", "a"],
#=> ["b", "b"], ["b", "c"], ["c", "a"], ["c", "b"], ["c", "c"]]
但是我想不出一个简单的方法来将这两个合并到原来的。
最佳答案
可能是这样的:
rest = hash.reject { |k,v| v.nil? }.to_a
wildvalues.map { |wv| Hash[rest + wildkeys.zip(wv)] }
甚至
wildvalues.map { |wv| hash.merge(Hash[wildkeys.zip(wv)]) }
关于ruby - 用每个可能的值填充散列中的通配符值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352443/