我觉得这对某人来说一定是个问题,而我花了很多时间试图找到一个解决方案而找不到我喜欢的解决方案.
我不会试图用语言说出我需要的东西,只是给出一些示例输入和它们的预期输出作为Rspec代码:
方法是:
def explode(hash) ... end
规范:
describe '#explode' do it do expect(explode({:a => 1,:b => 2})). to eq [[:a,1,:b,2]] end it do expect(explode({:a => 1,:b => [2,3,4]})). to eq [ [:a,2],[:a,3],4] ] end it do expect(explode({:a => [1,:b => [3,2,4],4] ] end it do expect(explode({:a => 1,:c => [4,5,6]})). to eq [ [:a,:c,5],6],6] ] end end
Ruby以外的语言解决方案也受到欢迎.
解决方法
Array#product似乎很适合这里.
h1 = {:a => 1,:b => 2} h2 = {:a => 1,4]} h3 = {:a => [1,4]} h4 = {:a => 1,6]} def explode hash a,*b = hash.transform_values { |v| [*v] }.values.unshift a.product(*b).map { |ar| hash.keys.zip(ar).flatten }.sort_by(&:last) end p explode h1 #[[:a,2]] p explode h2 #[[:a,# [:a,4]] p explode h3 #[[:a,4]] p explode h4 #[[:a,6]]
为了我的工作方法,我不得不重新映射值,所以它们都是数组,这是不理想的.但我仍然发布这个答案,因为它可能会给你或其他人一个起点.