ruby语法之zip
keys = [:foo, :bar, :bat] vals = [4, 5, 6] # do something to get {foo: 4, bar: 5, bat: 6}
h = Hash[keys.zip vals]
# 其中 keys.zip vals => [[:foo, 4], [:bar, 5], [:bat, 6]]
# 然后再用Hash::[]方法生成一个Hash
数组等长的情况下,这么做很完美,如果不等长呢?
keys = [:foo, :bar, :bat] vals = [4, 5, 6, 7] keys.zip vals # => [[:foo, 4], [:bar, 5], [:bat, 6]] vals = [4, 5] keys.zip vals # => [[:foo, 4], [:bar, 5], [:bat, nil]]
kvs = keys.zip vals [keys, vals].transpose == kvs # => keys和vals长度相同时为true,长度不同时transpose方法会报错 Hash[kvs] == kvs.to_h # => true
实例:
irb(main):001:0> a = [1,2,3,4] => [1, 2, 3, 4] irb(main):002:0> b = ['a', 'b', 'c', 'd'] => ["a", "b", "c", "d"] irb(main):003:0> Hash[b.zip a] => {"a"=>1, "b"=>2, "c"=>3, "d"=>4} irb(main):004:0> b.zip a => [["a", 1], ["b", 2], ["c", 3], ["d", 4]]