在哈希数组数组中创建和添加元素的正确方法是什么?
这与我想要的类似,初始化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
。
答案 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。