【问题标题】:Creating multi-dimensional array of hashes创建多维哈希数组
【发布时间】:2014-09-18 23:21:16
【问题描述】:

我想循环遍历一个多维数组:

array = [[1,2,3,4,5], [6,7,8,9,10]] 

并使用来自另一个数组的键创建散列:

keyValues = "one","two","three","four","five"

我有以下代码可以做到这一点:

hash = Hash.new
multiArray = Array.new
array.each do |values|
  keyValues.each do |key|
    i = keyValues.index(key)
    hash[key] = values[i]
  end
  puts hash
  multiArray << hash     
end
puts multiArray

puts hash 输出:

{"one"=>1, "two"=>2, "three"=>3, "four"=>4, "five"=>5}
{"one"=>6, "two"=>7, "three"=>8, "four"=>9, "five"=>10}

最后的multiArray是:

{"one"=>6, "two"=>7, "three"=>8, "four"=>9, "five"=>10}
{"one"=>6, "two"=>7, "three"=>8, "four"=>9, "five"=>10}

我不知道为什么我没有收到:

{"one"=>1, "two"=>2, "three"=>3, "four"=>4, "five"=>5}

为最后的multiArray

【问题讨论】:

    标签: ruby loops hash multidimensional-array


    【解决方案1】:

    既然@August 已经发现您的代码存在问题,我想建议一种紧凑的、类似 Ruby 的方式来获得您想要的结果。

    代码

    def make_hash(array, key_values)
        array.map { |a| key_values.zip(a).to_h }
    end
    

    示例

    array = [[1,2,3,4,5], [6,7,8,9,10]] 
    key_values = ["one","two","three","four","five"]
    
    make_hash(array, key_values)
      #=> [{"one"=>1, "two"=>2, "three"=>3, "four"=>4, "five"=>5},
      #    {"one"=>6, "two"=>7, "three"=>8, "four"=>9, "five"=>10}]
    

    说明

    Enumerable#map 传入块的第一个值是:

    a = [1,2,3,4,5]
    

    所以我们有

    b = key_values.zip(a)
      #=> [["one", 1], ["two", 2], ["three", 3], ["four", 4], ["five", 5]]
    b.to_h
      #=> {"one"=>1, "two"=>2, "three"=>3, "four"=>4, "five"=>5}
    

    对于 Array.to_h 时),我们必须编写 Hash(b) 而不是 b.to_h

    同样,传递给块的第二个值是:

    a = [6,7,8,9,10]
    

    所以

    key_values.zip(a).to_h
      #=> {"one"=>6, "two"=>7, "three"=>8, "four"=>9, "five"=>10}
    

    【讨论】:

      【解决方案2】:

      您的数组有两个相同哈希对象的条目。因此,如果您在任何地方更改散列对象,它将在两个数组条目中发生变化。为避免在每个数组条目中具有完全相同的哈希对象,您可以在插入之前复制哈希,方法是将 multiArray &lt;&lt; hash 更改为 multiArray &lt;&lt; hash.dup

      【讨论】:

        【解决方案3】:

        首先,安装y_support gem (gem install y_support)。它定义了Array#&gt;&gt; 对构造哈希有用的操作符:

        require 'y_support/core_ext/array'
        [ :a, :b, :c ] >> [ 1, 2, 3 ]
        #=> {:a=>1, :b=>2, :c=>3}
        

        有了它,你的工作可以这样完成:

        array = [1,2,3,4,5], [6,7,8,9,10] 
        key_values = ["one","two","three","four","five"]
        
        multi_array = array.map { |a| key_values >> a }
        #=> [{"one"=>1, "two"=>2, "three"=>3, "four"=>4, "five"=>5},
             {"one"=>6, "two"=>7, "three"=>8, "four"=>9, "five"=>10}]
        

        【讨论】:

          猜你喜欢
          • 2018-01-26
          • 2011-04-22
          • 1970-01-01
          • 2019-06-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 2019-07-14
          • 1970-01-01
          相关资源
          最近更新 更多