ruby – 将数组和/或标量的散列转换为标量组合数组的数组

我觉得这对某人来说一定是个问题,而我花了很多时间试图找到一个解决方案而找不到我喜欢的解决方案.

我不会试图用语言说出我需要的东西,只是给出一些示例输入和它们的预期输出作为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]]

为了我的工作方法,我不得不重新映射值,所以它们都是数组,这是不理想的.但我仍然发布这个答案,因为它可能会给你或其他人一个起点.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...