新手问题 两个 array 合并成 iterator hash

luffycn · December 05, 2014 · Last by luffycn replied at December 09, 2014 · 3508 hits

one = ['a', 'b', 'c'] two = ['A', 'B', 'C']

想合并成 [ 0 => {:one => 'a', :two => 'A'}, 1 => {:one => 'b', :two => 'B'}, 2 => {:one => 'c', :two => 'C'}, ]

有没有什么快捷的办法

one.zip(two).map{|one,two| {one:one,two:two}}

#或者
one.zip(two).map{|one,two| {one:one,two:two}}
  .each_with_index.map{|e,i| {i=>e}}.reduce({},&:merge)

#或者
Hash[*one.zip(two).map{|one,two| {one:one,two:two}}.each_with_index.to_a.map(&:reverse).flatten]

#或者
one.zip(two).reduce({}) do |res, zp|
  one,two = zp
  i = res.size
  res.merge!(i=>{one:one,two:two})
end

@davidhuangdw 如果不确定要合并的数组的个数该如何处理了, 比如,有可能是

one = ['a', 'b', 'c'] two = ['A', 'B', 'C'] 需要合并

也有可能是

one = ['a', 'b', 'c'] two = ['A', 'B', 'C'] three=['m', 'n', 'k', 'h']

#2 楼 @luffycn 输入是什么样的呢?keys 是给定的吗? 变长是 ok 的。假如,输入是 arrys 和 keys:

one = ['a', 'b', 'c']
two = ['A', 'B', 'C']
three=['m', 'n', 'k', 'h']
four=%w(x y )

#假设输入为 arrays, keys:
arrays = [one,two,three,four]
keys = %w{one two three four}
#or
keys = %w{one two three four five six seven ...}.first(arrays.size)

#那么可以这样:
klass = Struct.new(*keys.map(&:to_sym))
objects = arrays.reduce(&:zip).map{|tup| klass.new(*tup.flatten)}.map(&:to_h)

def hash_from_arr(arr)
  arr.reduce({}) do |res, element|
    i = res.size
    res.merge!(i=>element)
  end
end
hash_from_arr(objects)

@davidhuangdw great, 完全达到目的了,thanks so much

You need to Sign in before reply, if you don't have an account, please Sign up first.