像这样
oldArray = [[a, b, c, d],[e, f, g, h]]
我需要一行代码,它将返回一个新数组,例如 oldArray 的每个元素中的元素 2
newArray = coolLine(oldArray, 2)
newArray -> [c, g]
这会执行第 2 个元素:
oldArray.map { |a| a[2] }
oldArray 的每个元素中的第二个元素
oldArray = [[a, b, c, d],[e, f, g, h]]
newArray = coolLine(oldArray, 2)
newArray -> [c, g]
您想要的东西可以通过多种方式实现。最常见的是map
and zip
。
这map
函数允许您处理序列并将其任何项目重新计算为新值:
arr = [ [ 1,2,3 ], %w{ a b c }, [ 10,20,30] ]
# proc will be called twice
# 'item' will first be [ 1,2,3 ] then %w{ a b c } and so on
result = arr.map{|item|
item[1]
}
result -> 2, then 'b', then 20
所以,创建你的“coolLine”看起来很简单。
但是,根据其他情况,拉链可能会变得更好。Zip 接受 N 个序列并依次枚举它们,一次从所有返回第 N 个元素。为什么,这几乎正是你所要求的:
arr = [ [ 1,2,3 ], %w{ a b c }, [ 10,20,30] ]
zipped = arr[0].zip(*arr[1..-1)
zipped -> [ [1,'a',10], [2,'b',20], [3,'c',30] ]
或者,您不喜欢 [0]/*[1..-1] 技巧,您可以轻松编写自己的“更干净的 zip”,例如https://stackoverflow.com/a/1601250/717732