通过将哈希与两个单独的数组进行比较来迭代哈希,并使用新的哈希所需结果到达

时间:2016-12-29 22:30:25

标签: ruby-on-rails ruby

  1. 数组1 = 7个元素
  2. 数组2 = 7个元素
  3. 哈希= 7个元素
  4. 我的要求是使用数组1和数组2中的每个元素遍历散列中的每个元素,并在应用所需逻辑后使用新散列。比较总是在哈希的第一个元素与数组1中的第一个元素和数组2中的第一个元素之间,依此类推,直到我完成列表。

    我甚至不知道在哪里以及如何开始,所以任何帮助都能让我开始

2 个答案:

答案 0 :(得分:1)

这是你在找什么?

arr1 = ['char', 'number', 'number', 'number', 'char', 'number', 'char']
arr2 = [6, '(7,0)','(15,0)','(5,0)',3,'(15,2)', 17]

h = { 'col1'=>'123456', 'col2'=>'0000111', 'col3'=>'000000002345',
      'col4'=>'00023',  'col5'=>'abc', 'col6'=>'00000000000052367',
      'col7'=>'0000000000321456' }

enum = arr1.zip(arr2).to_enum
  #=> #<Enumerator: [["char", 6], ["number", "(7,0)"], ["number", "(15,0)"],
  #     ["number", "(5,0)"], ["char", 3], ["number", "(15,2)"], ["char", 17]]:each>

h.merge(h) { |*,v| [v].concat(enum.next) }
  #=> {"col1"=>["123456", "char", 6], "col2"=>["0000111", "number", "(7,0)"],
  #    "col3"=>["000000002345", "number", "(15,0)"], "col4"=>["00023", "number", "(5,0)"],
  #    "col5"=>["abc", "char", 3], "col6"=>["00000000000052367", "number", "(15,2)"],
  #    "col7"=>["0000000000321456", "char", 17]} 

这使用Hash#merge的形式,它使用一个块来确定合并的两个哈希中存在的键的值,这里是哈希的所有键。

答案 1 :(得分:0)

您可以使用Array#zip来混合哈希和数组:

hash = {
  key1: :value1,
  key2: :value2,
  key3: :value3
}

array1 = %i(x1 x2 x3)
array2 = %i(y1 y2 y3)

new_hash = {}
hash.to_a.zip(array1, array2).each do |(key, value), element1, element2|
  # logic with key, value, element1, and element2
  # basic example :
  new_hash[key] = [value, element1, element2]
end

p new_hash
# {:key1=>[:value1, :x1, :y1], :key2=>[:value2, :x2, :y2], :key3=>[:value3, :x3, :y3]}