我有这个:
{: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}
任何帮助表示赞赏。
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
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
这可能超出了你的需要,但你可以将make all the values into an array和Array#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}]
这看起来很像家庭作业,所以这里有一些伪代码:
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])]
祝你好运搞清楚它的作用。