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

Ruby 如果其中一个值是数组,则重新创建对象,ruby,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} 非常感谢您的帮助。这看起来像

我有这个:

{: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}
非常感谢您的帮助。

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

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
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

祝你好运找到它的用途。

这可能超出了你的需要,但你可以和他们一起:

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}]

也许是
hash[:value].map{n | h=hash.dup;h[:value]=n;h}
或者
Array.new(hash.size){i | i | h=hash.dup;h[:value]=h[:value][i];h}
。我被书呆子剪了,写python一行程序来做这件事:
[(lambda i,o:(o.。u setitem:(value),o“value”][i][i,o])(i,o)][i,o])(对于i,i,o在[obj中的枚举,][“value”]]]
。如果你需要一份深度副本,
导入副本
并将
obj.copy()
替换为
copy.deepcopy(obj)
。祝你好运!这就是我需要的!谢谢Cary!这是为了我正在做的一个项目,但谢谢你的回答!:)我确实说了“可疑”“我通常认为,无论如何,送某人去正确的方向总比给他们答案好。”。
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}]