如何转换数组:
["John,Doe,11222019", "Mark,King,11232019", "Angle,Darma,11242019"]
像这样使用Ruby的哈希数组:
[
{ :name => "John Doe", :number => 11222019 },
{ :name => "Mark King", :number => 11232019 },
{ :name => "Angle Darma", :number => 11242019 },
]
非常感谢你!
你可以简单地完成如下,
array.map { |x| [:name, :number].zip(x.sub(',', ' ').split(',')).to_h }
# => [{:name=>"John Doe", :number=>11222019}, {:name=>"Mark King", :number=>11232019}, {:name=>"Angle Darma", :number=>11242019}]
使用Ruby 2.6.1 Object#then的选项:
ary = ["John,Doe,11222019", "Mark,King,11232019", "Angle,Darma,11242019"]
ary.map { |s| s.split(',').then{ |a| {name: a.first(2).join(' ') , number: a.last.to_i } } }
对于Ruby 2.5.2 Object#yield_self:
ary.map { |s| s.split(',').yield_self{ |a| {name: a.first(2).join(' ') , number: a.last.to_i } } }
两人都回归:
#=> [{:name=>"John Doe", :number=>11222019}, {:name=>"Mark King", :number=>11232019}, {:name=>"Angle Darma", :number=>11242019}]
arr = ["John,Doe,11222019", "Mark,King,11232019",
"Angle,Darma,11242019"]
arr.map do |s|
{name: s[/.+(?=,)/].tr(',',' '), number: s[/\d+/].to_i}
end
#=> [{:name=>"John Doe", :number=>11222019},
# {:name=>"Mark King", :number=>11232019},
# {:name=>"Angle Darma", :number=>11242019}]
步骤如下。 Enumerable#map将arr
的第一个元素传递给块,块变量s
设置为等于其值:
s = arr.first
#=> "John,Doe,11222019"
然后执行块计算:
a = s[/.+(?=,)/]
#=> "John,Doe"
这使用String#[]方法和正则表达式/.+(?=,)/
。 (?=,)
是一个积极的先行者,要求比赛立即用逗号表示。因为默认情况下匹配是贪婪的,所以前瞻符合s
中的最后一个逗号。
b = a.tr(',',' ')
#=> "John Doe"
这使用方法String#tr。或者,可以使用a.sub(',',' ')
。
c = s[/\d+/]
#=> "11222019"
d = c.to_i
#=> 11222019
该块然后返回:
{ name: c, number: d }
#=> {:name=>"11222019", :number=>11222019}
这是s
映射的对象。将arr
的剩余两个值传递给块并执行类似的计算。
a = [“John,Doe,11222019”,“Mark,King,11232019”,“Angle,Darma,11242019”]
像这样的东西
a.map do |f|
f = f.split(',')
{ name: "#{f[0]} #{f[1]}", number: f[2].to_i }
end
arr = ["John,Doe,11222019", "Mark,King,11232019", "Angle,Darma,11242019"]
arr.map do |item|
chunks = item.split(",")
{name: chunks[0...-1].join(" "), number: chunks[-1]}
end
通过[0 ...- 1]索引允许您在名称部分(中间名或2个姓氏)中具有可变数量的项目,这是非常常见的。