如何创建和添加哈希数组数组的元素

时间:2016-04-21 16:07:43

标签: arrays ruby hash

在哈希数组数组中创建和添加元素的正确方法是什么?

这与我想要的类似,初始化result变量:

col1.each_with_index do |ob1,index1|
  col2.each_with_index do |ob2,index2|
    col3.each do |ob3|
      result[index1][index2][ob3.id] = Obj.new(ob1.att, ob2.att, ob3.att)
    end
  end
end

我应该可以访问result,如:

result[1][2][1031]

其中1031是id,其他是0..n的索引。它应该返回Obj

的实例

3 个答案:

答案 0 :(得分:3)

出于好奇,懒惰的实例化对象建立在Hash#default_proc之上:

result = Hash.new { |h1, k1|
  (0...col1.size) === k1 ? h1[k1] = Hash.new { |h2, k2|
    (0...col2.size) === k2 ? h2[k2] = Hash.new { |h3, k3|
      o3 = col3.detect { |o| o.id == k3 }
      o3 ? h3[k3] = Obj.new(col1[k1].att, col2[k2].att, o3.att) : nil
    } : nil
  } : nil
}

Disclamer:请不要在生产中使用这种编码风格。该示例仅用于演示目的。

答案 1 :(得分:2)

您可以这样做:

result = []
[1,3,5].each_with_index do |ob1,index1|
  [2,4,6].each_with_index do |ob2,index2|
    [{ id: 1000 }, { id: 10000 }, { id: 10000 }].each do |ob3|
      result[index1] = result[index1] || []
      result[index1][index2] = result[index1][index2] || {}
      result[index1][index2][ob3[:id]] = { a: ob1, b: ob2, c: ob3 }
    end
  end
end

为简单起见,我将您的.id更改为[:id]。如果你想要的东西已经存在,那么我们的想法是将它设置为自己,或者将其初始化为你想要的东西。

答案 2 :(得分:1)

如果要创建数组数组,可以使用以下语法:

2.3.0 :001 > Array.new(2) { Array.new(3) }
 => [[nil, nil, nil], [nil, nil, nil]]

# Or, 3 level deep array
2.3.0 :002 > Array.new(2) { Array.new(3) { Array.new(4) } }
 => [[[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil]], [[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil]]]

还要考虑使用Hash' es。