【发布时间】:2019-02-04 11:10:15
【问题描述】:
我有一个基本数组[[1,2],[2,4],[3,6]]
我想把它分成两个数组,这样......
a = [1,2,3]
b = [2,4,6]
【问题讨论】:
标签: ruby-on-rails arrays ruby
我有一个基本数组[[1,2],[2,4],[3,6]]
我想把它分成两个数组,这样......
a = [1,2,3]
b = [2,4,6]
【问题讨论】:
标签: ruby-on-rails arrays ruby
您可以简单地使用Array#transpose,如下所示,
arr = [[1,2],[2,4],[3,6]]
# => [[1, 2], [2, 4], [3, 6]]
a, b = arr.transpose
# => [[1, 2, 3], [2, 4, 6]]
a
# => [1, 2, 3]
b
# => [2, 4, 6]
【讨论】:
transpose 最好 +1
transpose 的东西都确实会获得支持:)
c = [[1,2],[2,4],[3,6]]
您可以使用 map 并插入到两个不同的数组中
a = c.map{|x,y| x}
# => [1, 2, 3]
b = c.map{|x,y| y}
#=> [2, 4, 6]
编辑作为@DaveMongoose 评论你也可以这样写
a = c.map(&:first)
b = c.map(&:last)
【讨论】:
a = c.map(&:first)和b = c.map(&:last)
一种方法是使用each 之类的函数,并利用 Ruby 的自动数组拆分:
ary = [[1,2],[2,4],[3,6]]
a = []
b = []
ary.each{|first,second| a << first; b << second}
# The entry [1,2] is automatically split into first = 1 and second = 2
如果你愿意,你也可以使用each_with_object在单个方法调用中编写它
a,b = ary.each_with_object([[],[]]) do |(first, second), result|
result[0] << first
result[1] << second
}
第三种选择是使用Array.zip:
a,b = ary[0].zip(*ary[1..-1])
zip 通过将具有相同索引的条目配对来组合数组(正如您在此处所做的那样)。这里的* 是 splat 运算符,它将数组数组解包成一系列参数。
【讨论】:
transpose。 each 应该只在没有更具体的方法可以完成这项工作时使用。
transpose