Ruby 带数组的表,返回哈希
我有一个数组Ruby 带数组的表,返回哈希,ruby,hash,Ruby,Hash,我有一个数组[“1”、“1”、“a”、“b”、“y”]和表1: table1 POSITION NAME VALUE CODE 1 Animal Dog 1 1 Animal Cat 2 1 Animal Bird 3 2 Place USA 1 2 Place Other 2 3
[“1”、“1”、“a”、“b”、“y”]
和表1
:
table1
POSITION NAME VALUE CODE
1 Animal Dog 1
1 Animal Cat 2
1 Animal Bird 3
2 Place USA 1
2 Place Other 2
3 Color Red a
3 Color Blue b
3 Color Orange c
4 Age Young a
4 Age Middle b
4 Age Old c
5 Alive Yes y
5 Alive No n
对于数组中的每个元素,我想在table1
中找到匹配的POSITION
-code
组合,其中POSITION
是元素(基1)的索引,code
是数组中的元素。然后,我想返回一个散列,其中包含匹配项对应的名称
和值
,作为键及其值。产出将是:
{"Animal" => "Dog", "Place" => "USA", "Color" => "Red", "Age" => "Middle", "Alive" => "Yes"}
我该怎么做呢?我假设您要将多个
代码
数组映射到同一个表中。假设您首先将表读入数组:
a = [["1", "Animal", "Dog", "1"],
["1", "Animal", "Cat", "2"],
["1", "Animal", "Bird", "3"],
["2", "Place", "USA", "1"],
["2", "Place", "Other", "2"],
["3", "Color", "Red", "a"],
["3", "Color", "Blue", "b"],
["3", "Color", "Orange", "c"],
["4", "Age", "Young", "a"],
["4", "Age", "Middle", "b"],
["4", "Age", "Old", "c"],
["5", "Alive", "Yes", "y"],
["5", "Alive", "No", "n"]]
及
然后你可以这样做:
codes.zip(a.chunk { |a| a.first }).map { |l,(_,b)|
b.find { |c| c.last == l}[1...-1] }.to_h
#=> {"Animal"=>"Dog", "Place"=>"USA", "Color"=>"Red",
# "Age"=>"Middle", "Alive"=>"Yes"}
步骤如下:
enum0 = a.chunk { |a| a.first }
#=> #<Enumerator:
# #<Enumerator::Generator:0x007f8d6a0269b8>:each>
因此x.zip(y)
的第一个元素被映射到[“动物”、“狗”]
对enum1
的每个其他元素执行相同的操作后,x.zip(y)
等于:
f = [["Animal", "Dog"], ["Place", "USA"], ["Color","Red"],
["Age", "Middle"], ["Alive", "Yes"]]
最后的步骤是
f.to_h
#=> {"Animal"=>"Dog", "Place"=>"USA", "Color"=>"Red",
# "Age"=>"Middle", "Alive"=>"Yes"}
或对于Hash[f]
你的数据库客户端是什么。。请始终提及它。
“b”
为什么映射到“年龄”=>“中间”而不是“颜色”=>“蓝色”?因为b是数组中的第四个字符,它将与标记为位置4的项目匹配。我知道数组包含一个零索引,但这就是给我的表的样子。@sabrams这对你来说是至关重要的。。请在代码中提及。如果表中有近200条记录,而数组中有近25个元素,这是否仍能很好地执行?@sabrams表中有这些数据,对吗?是的,表1中的数据在它自己的表/模型中。数组将是早期代码的输入。如果只有一条记录与表匹配,则查询可能更有效。(我真的不知道——不是我的领域。)这主要是针对您希望在同一个表上匹配多个数组的情况。@sabrams您的Ruby版本是什么?
f = [["Animal", "Dog"], ["Place", "USA"], ["Color","Red"],
["Age", "Middle"], ["Alive", "Yes"]]
f.to_h
#=> {"Animal"=>"Dog", "Place"=>"USA", "Color"=>"Red",
# "Age"=>"Middle", "Alive"=>"Yes"}
Hash[f]