将数组数组转换为 Ruby 中的哈希数组
Transforming an array of arrays to an array of hashes in Ruby
我正在尝试将二维数组转换为哈希数组。
这是我的数组:
[[8765, 105191, 2.0, 1582.1], [4321, 62870, 2.0, 603.24], [1234, 62870, 2.0, 500.24]]
我正在尝试将其转换为哈希值数组。像这样:
[{"sales_user_id"=>"8765", "user_id"=>"105191", "month"=>"2", "sum"=>"1582.1"},
{"sales_user_id"=>"4321", "user_id"=>"62870", "month"=>"2", "sum"=>"603.24"},
{"sales_user_id"=>"1234", "user_id"=>"62870", "month"=>"2", "sum"=>"500.24"}]
我正在分解每个数组并为数组中的值分配一个键。我对 ruby 还是有点陌生,我不确定从哪里开始。
这对于 Enumerable#zip
来说非常简单:
values = [ [ 8765, 105191, 2.0, 1582.1 ],
[ 4321, 62870, 2.0, 603.24 ],
[ 1234, 62870, 2.0, 500.24 ] ]
keys = %w[sales_user_id user_id month sum]
p values.map {|arr| keys.zip(arr).to_h }
# => [ { "sales_user_id" => 8765, "user_id" => 105191, "month" => 2.0, "sum" => 1582.1 },
# { "sales_user_id" => 4321, "user_id" => 62870, "month" => 2.0, "sum" => 603.24 },
# { "sales_user_id" => 1234, "user_id" => 62870, "month" => 2.0, "sum" => 500.24 } ]
arr = [[8765, 105191, 2.0, 1582.1 ],
[4321, 62870, 2.0, 603.24],
[1234, 62870, 2.0, 500.24]]
keys = ["sales_user_id", "user_id", "month", "sum"]
第一种方式
[keys].product(arr).map { |a| a.transpose.to_h }
#=> [{"sales_user_id"=>8765, "user_id"=>105191, "month"=>2.0, "sum"=>1582.1},
# {"sales_user_id"=>4321, "user_id"=> 62870, "month"=>2.0, "sum"=>603.24},
# {"sales_user_id"=>1234, "user_id"=> 62870, "month"=>2.0, "sum"=>500.24}]
步骤:
enum = [keys].product(arr)
#=> #<Enumerator:
# [
# [["sales_user_id", "user_id", "month", "sum"], [8765, 105191, 2.0, 1582.1]],
# [["sales_user_id", "user_id", "month", "sum"], [4321, 62870, 2.0, 603.24]],
# [["sales_user_id", "user_id", "month", "sum"], [1234, 62870, 2.0, 500.24]]
# ]:map>
a = enum.next
#=> [["sales_user_id", "user_id", "month", "sum"], [8765, 105191, 2.0, 1582.1]]
c = a.transpose
#=> [["sales_user_id", 8765], ["user_id", 105191], ["month", 2.0], ["sum", 1582.1]]
c.to_h
#=> {"sales_user_id"=>8765, "user_id"=>105191, "month"=>2.0, "sum"=>1582.1}
a = enum.next
#=> [["sales_user_id", "user_id", "month", "sum"], [4321, 62870, 2.0, 603.24]]
c = a.transpose
#=> [["sales_user_id", 4321], ["user_id", 62870], ["month", 2.0], ["sum", 603.24]]
c.to_h
#=> {"sales_user_id"=>4321, "user_id"=>62870, "month"=>2.0, "sum"=>603.24}
a = enum.next
#=> [["sales_user_id", "user_id", "month", "sum"], [1234, 62870, 2.0, 500.24]]
c = a.transpose
#=> [["sales_user_id", 1234], ["user_id", 62870], ["month", 2.0], ["sum", 500.24]]
c.to_h
#=> {"sales_user_id"=>1234, "user_id"=>62870, "month"=>2.0, "sum"=>500.24}
第二种方式
arr.map do |a|
ad = a.dup
{ "sales_user_id"=>ad.shift, "user_id"=>ad.shift, "month"=>ad.shift, "sum"=>ad.shift }
end
#=> [{"sales_user_id"=>8765, "user_id"=>105191, "month"=>2.0, "sum"=>1582.1},
# {"sales_user_id"=>4321, "user_id"=> 62870, "month"=>2.0, "sum"=>603.24},
# {"sales_user_id"=>1234, "user_id"=> 62870, "month"=>2.0, "sum"=>500.24}]
如果每个对象都有一组固定的值,也可以考虑使用 Struct。几乎可以用作哈希。
User = Struct.new(:sales_user_id, :user_id, :month, :sum)
array = [[8765, 105191, 2.0, 1582.1], [4321, 62870, 2.0, 603.24], [1234, 62870, 2.0, 500.24]]
users = array.map {|values| User.new *values}
p users #=> [#<struct User sales_user_id=8765, user_id=105191, month=2.0, sum=1582.1>, #<struct User sales_user_id=4321, user_id=62870, month=2.0, sum=603.24>, #<struct User sales_user_id=1234, user_id=62870, month=2.0, sum=500.24>]
p users.first.user_id #=> 105191
p users.first['user_id'] #=> 105191
p users.first[:user_id] #=> 105191
这是一种使用 .collect
迭代外部数组并为每个内部数组构造哈希的方法:
values = [[8765, 105191, 2.0, 1582.1],
[4321, 62870, 2.0, 603.24],
[1234, 62870, 2.0, 500.24]]
result = values.collect do |array|
{
"sales_user_id" => array[0].to_s,
"user_id" => array[1].to_s,
"month" => array[2].to_i.to_s,
"sum" => array[3].to_s
}
end
result
:
[{"sales_user_id"=>"8765", "user_id"=>"105191", "month"=>"2", "sum"=>"1582.1"},
{"sales_user_id"=>"4321", "user_id"=>"62870", "month"=>"2", "sum"=>"603.24"},
{"sales_user_id"=>"1234", "user_id"=>"62870", "month"=>"2", "sum"=>"500.24"}]
它还使用 .to_s
和 .to_i
将结果强制转换为问题中的值(如 8765
到 "8765"
和 2.0
到 "2"
).
我正在尝试将二维数组转换为哈希数组。 这是我的数组:
[[8765, 105191, 2.0, 1582.1], [4321, 62870, 2.0, 603.24], [1234, 62870, 2.0, 500.24]]
我正在尝试将其转换为哈希值数组。像这样:
[{"sales_user_id"=>"8765", "user_id"=>"105191", "month"=>"2", "sum"=>"1582.1"},
{"sales_user_id"=>"4321", "user_id"=>"62870", "month"=>"2", "sum"=>"603.24"},
{"sales_user_id"=>"1234", "user_id"=>"62870", "month"=>"2", "sum"=>"500.24"}]
我正在分解每个数组并为数组中的值分配一个键。我对 ruby 还是有点陌生,我不确定从哪里开始。
这对于 Enumerable#zip
来说非常简单:
values = [ [ 8765, 105191, 2.0, 1582.1 ],
[ 4321, 62870, 2.0, 603.24 ],
[ 1234, 62870, 2.0, 500.24 ] ]
keys = %w[sales_user_id user_id month sum]
p values.map {|arr| keys.zip(arr).to_h }
# => [ { "sales_user_id" => 8765, "user_id" => 105191, "month" => 2.0, "sum" => 1582.1 },
# { "sales_user_id" => 4321, "user_id" => 62870, "month" => 2.0, "sum" => 603.24 },
# { "sales_user_id" => 1234, "user_id" => 62870, "month" => 2.0, "sum" => 500.24 } ]
arr = [[8765, 105191, 2.0, 1582.1 ],
[4321, 62870, 2.0, 603.24],
[1234, 62870, 2.0, 500.24]]
keys = ["sales_user_id", "user_id", "month", "sum"]
第一种方式
[keys].product(arr).map { |a| a.transpose.to_h }
#=> [{"sales_user_id"=>8765, "user_id"=>105191, "month"=>2.0, "sum"=>1582.1},
# {"sales_user_id"=>4321, "user_id"=> 62870, "month"=>2.0, "sum"=>603.24},
# {"sales_user_id"=>1234, "user_id"=> 62870, "month"=>2.0, "sum"=>500.24}]
步骤:
enum = [keys].product(arr)
#=> #<Enumerator:
# [
# [["sales_user_id", "user_id", "month", "sum"], [8765, 105191, 2.0, 1582.1]],
# [["sales_user_id", "user_id", "month", "sum"], [4321, 62870, 2.0, 603.24]],
# [["sales_user_id", "user_id", "month", "sum"], [1234, 62870, 2.0, 500.24]]
# ]:map>
a = enum.next
#=> [["sales_user_id", "user_id", "month", "sum"], [8765, 105191, 2.0, 1582.1]]
c = a.transpose
#=> [["sales_user_id", 8765], ["user_id", 105191], ["month", 2.0], ["sum", 1582.1]]
c.to_h
#=> {"sales_user_id"=>8765, "user_id"=>105191, "month"=>2.0, "sum"=>1582.1}
a = enum.next
#=> [["sales_user_id", "user_id", "month", "sum"], [4321, 62870, 2.0, 603.24]]
c = a.transpose
#=> [["sales_user_id", 4321], ["user_id", 62870], ["month", 2.0], ["sum", 603.24]]
c.to_h
#=> {"sales_user_id"=>4321, "user_id"=>62870, "month"=>2.0, "sum"=>603.24}
a = enum.next
#=> [["sales_user_id", "user_id", "month", "sum"], [1234, 62870, 2.0, 500.24]]
c = a.transpose
#=> [["sales_user_id", 1234], ["user_id", 62870], ["month", 2.0], ["sum", 500.24]]
c.to_h
#=> {"sales_user_id"=>1234, "user_id"=>62870, "month"=>2.0, "sum"=>500.24}
第二种方式
arr.map do |a|
ad = a.dup
{ "sales_user_id"=>ad.shift, "user_id"=>ad.shift, "month"=>ad.shift, "sum"=>ad.shift }
end
#=> [{"sales_user_id"=>8765, "user_id"=>105191, "month"=>2.0, "sum"=>1582.1},
# {"sales_user_id"=>4321, "user_id"=> 62870, "month"=>2.0, "sum"=>603.24},
# {"sales_user_id"=>1234, "user_id"=> 62870, "month"=>2.0, "sum"=>500.24}]
如果每个对象都有一组固定的值,也可以考虑使用 Struct。几乎可以用作哈希。
User = Struct.new(:sales_user_id, :user_id, :month, :sum)
array = [[8765, 105191, 2.0, 1582.1], [4321, 62870, 2.0, 603.24], [1234, 62870, 2.0, 500.24]]
users = array.map {|values| User.new *values}
p users #=> [#<struct User sales_user_id=8765, user_id=105191, month=2.0, sum=1582.1>, #<struct User sales_user_id=4321, user_id=62870, month=2.0, sum=603.24>, #<struct User sales_user_id=1234, user_id=62870, month=2.0, sum=500.24>]
p users.first.user_id #=> 105191
p users.first['user_id'] #=> 105191
p users.first[:user_id] #=> 105191
这是一种使用 .collect
迭代外部数组并为每个内部数组构造哈希的方法:
values = [[8765, 105191, 2.0, 1582.1],
[4321, 62870, 2.0, 603.24],
[1234, 62870, 2.0, 500.24]]
result = values.collect do |array|
{
"sales_user_id" => array[0].to_s,
"user_id" => array[1].to_s,
"month" => array[2].to_i.to_s,
"sum" => array[3].to_s
}
end
result
:
[{"sales_user_id"=>"8765", "user_id"=>"105191", "month"=>"2", "sum"=>"1582.1"},
{"sales_user_id"=>"4321", "user_id"=>"62870", "month"=>"2", "sum"=>"603.24"},
{"sales_user_id"=>"1234", "user_id"=>"62870", "month"=>"2", "sum"=>"500.24"}]
它还使用 .to_s
和 .to_i
将结果强制转换为问题中的值(如 8765
到 "8765"
和 2.0
到 "2"
).