如果其中一个值是数组,则重新创建对象

时间:2018-06-14 21:24:21

标签: ruby

我有这个:

{:foo => "bar", :john => "doe", :value => [1, 2, 3]}

我想:

{:foo => "bar", :john => "doe", :value => 1}
{:foo => "bar", :john => "doe", :value => 2}
{:foo => "bar", :john => "doe", :value => 3}

感谢任何帮助。

4 个答案:

答案 0 :(得分:0)

my_obj = {:foo => "bar", :john => "doe", :value => [1, 2, 3]}

if my_obj[:value].kind_of? Array
  my_obj = my_obj[:value].map{|v| {:foo => my_obj[:foo], :john => my_obj[:john], :value => v} }
end

答案 1 :(得分:0)

def doit(h)
  key, value = h.find { |k,v| v.is_a?(Array) }
  key.nil? ? nil : value.map { |x| h.merge(key => x) }
end

doit({ :foo => "bar", :john => "doe", :value => [1, 2, 3] })
  #=> [{:foo=>"bar", :john=>"doe", :value=>1},
  #    {:foo=>"bar", :john=>"doe", :value=>2},
  #    {:foo=>"bar", :john=>"doe", :value=>3}]

doit({ :foo => "bar", :john => "doe" })
  #=> nil

答案 2 :(得分:0)

这看起来很可疑像家庭作业一样,所以这里有一些伪代码:

function xyzzy (obj)
    L = length(obj.value)
    newobjs = array of length L
    for(i=0;i<L;i++)
        newobjs[i] = obj
        obj.value = obj.value[i]
    return newobjs

完全不相关的笔记上,我书呆子自我写道:

lambda O,v:[(lambda o:(o.update({v:x}),o))(O.copy())[1] for i,x in enumerate(O[v])]

祝你好运搞清楚它的作用。

答案 3 :(得分:0)

这可能超出了您的需求,但您可以make all the values into an arrayArray#product在一起:

def transform(hash)
  first, *rest = hash.values.map(&method(:Array))

  first.product(*rest).map do |values|
    hash.keys.zip(values).to_h
  end
end

然后:

transform({:foo => "bar", :john => "doe", :value => [1, 2, 3]})
# => [{:foo=>"bar", :john=>"doe", :value=>1},
      {:foo=>"bar", :john=>"doe", :value=>2},
      {:foo=>"bar", :john=>"doe", :value=>3}]
transform({:foo => "baz", :john => "smith", :value => 4})
# => [{:foo=>"baz", :john=>"smith", :value=>4}]
transform({:foo => ["bar", "baz"], :john => ["doe", "smith"], :value => [1, 2, 3, 4]})
# => [{:foo=>"bar", :john=>"doe", :value=>1},
      {:foo=>"bar", :john=>"doe", :value=>2},
      {:foo=>"bar", :john=>"doe", :value=>3},
      {:foo=>"bar", :john=>"doe", :value=>4},
      {:foo=>"bar", :john=>"smith", :value=>1},
      {:foo=>"bar", :john=>"smith", :value=>2},
      {:foo=>"bar", :john=>"smith", :value=>3},
      {:foo=>"bar", :john=>"smith", :value=>4},
      {:foo=>"baz", :john=>"doe", :value=>1},
      {:foo=>"baz", :john=>"doe", :value=>2},
      {:foo=>"baz", :john=>"doe", :value=>3},
      {:foo=>"baz", :john=>"doe", :value=>4},
      {:foo=>"baz", :john=>"smith", :value=>1},
      {:foo=>"baz", :john=>"smith", :value=>2},
      {:foo=>"baz", :john=>"smith", :value=>3},
      {:foo=>"baz", :john=>"smith", :value=>4}]
transform({:foo => "bar", :john => ["doe", "smith"], :value => 4})
# => [{:foo=>"bar", :john=>"doe", :value=>4},
     {:foo=>"bar", :john=>"smith", :value=>4}]