从Ruby中的现有数组创建新数组

mas*_*llz 3 ruby arrays ruby-on-rails ruby-on-rails-4

我有以下2个数组:

fields = ["name", "team", "number", "name", "team", "number", "name", "team", "number"]
values = ["Patrick Ewing", "New York Knicks", 33, "Rik Smits", "Indiana Pacers", 45, "Bill Russell", "Boston Celtics", 6]
Run Code Online (Sandbox Code Playgroud)

这些字段将始终只是名称,团队和数字,但值的数量(即玩家数量)每次都会有所不同.

我想为每个字段类型创建新数组,以便我得到以下内容:

names = ["Patrick Ewing", "Rik Smits", "Bill Russell"]
teams = ["New York Knicks", "Indiana Pacers", "Boston Celtics"]
numbers = [33,45,6]
Run Code Online (Sandbox Code Playgroud)

这样做的好方法是什么?我尝试了以下内容,但想知道是否有其他解决方案可以更好地使用更大的阵列(最多300个).或者差异可以忽略不计?

names = values.values_at(*(fields.each_index.select{ |i| fields[i] == "name"}))
teams = values.values_at(*(fields.each_index.select{ |i| fields[i] == "team"}))
numbers = values.values_at(*(fields.each_index.select{ |i| fields[i] == "number"}))
Run Code Online (Sandbox Code Playgroud)

vee*_*vee 5

这是另一种/简洁的方式:

> name, team, number = values.each_slice(3).to_a.transpose
=> name
> ["Patrick Ewing", "Rik Smits", "Bill Russell"]
=> team
> ["New York Knicks", "Indiana Pacers", "Boston Celtics"]
=> number
> [33, 45, 6]
Run Code Online (Sandbox Code Playgroud)

Ruby的Array#转换之美发挥作用,特别适合您的问题.

  • 这是一个非常聪明的单线.尼斯. (2认同)
  • 使用`name,team,number = values.each_slice(3).to_a.transpose`和`name,team,number = values.each_slice(3).each_with_object([]){| _,acc |之间的区别是什么?acc << _} .transpose`? (2认同)