如何将像这样的数组[“John,Doe,11222019”,“Mark,King,11232019”,“Angle,Darma,11242019”]转换为散列Ruby数组

问题描述 投票:2回答:5

如何转换数组:

["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 },
] 

非常感谢你!

arrays ruby object hash each
5个回答
2
投票

你可以简单地完成如下,

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}] 

2
投票

使用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}]

1
投票
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#maparr的第一个元素传递给块,块变量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的剩余两个值传递给块并执行类似的计算。


0
投票

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

0
投票
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个姓氏)中具有可变数量的项目,这是非常常见的。

© www.soinside.com 2019 - 2024. All rights reserved.