我在ruby中有一个嵌套数组,与下面的类似,但是还有很多嵌套数组。
arr=[[1,2,3],[4,5,6],[7,8,9]]
是否有一种方法可以获取嵌套数组中的每个第二个元素,并将x添加到该元素?我使用了下面的代码,但是如果我想知道一种更快的方法。
x = 5
arr[0][1], arr[1][1], arr[2][1] = arr[0][1]+x, arr[1][1]+x, arr[2][1]+x
我拥有尝试使用arr.map!{|f,l| [f, l + 1]}
,但得到的结果是arr == [[1, 3], [4, 6], [7, 9]]
编辑:
所以结果应该是arr == [[1,2+x,3],[4,5+x,6],[7,8+x,9]]
每当您发现自己一遍又一遍地编写此类代码时,就应该使用循环! Ruby通常使用iterators进行循环。 Array#each是一个遍历数组的迭代器,可让您一次对每个元素进行操作。
由于您知道要在每个元素的第二个元素中添加x,所以这很简单:
arr.each {|e| e[1] += x }
此将arr
(和arr
的子数组)替换到位。如果要返回变异的副本,则可以使用map
,它类似于each
,但返回值是该块的输出,而不是该块的输入。
# First we clone each subarray with Array#dup, then we iterate the
# clones, adding x to the second element. Because we're using `map`
# the result will be a new array, rather than the original arr, leaving
# the original unmodified.
new_arr = arr.map(&:dup).each {|e| e[1] += x }
您接近了!您可以使用map
遍历每个子数组,并使用ruby +=
运算符将x
添加到每个子数组的第二个元素中。 map
的技巧是,您需要在每个循环中返回entire子数组,如下所示:
arr.map { |a| a[1] += x; a }
#=> [[1, 7, 3], [4, 10, 6], [7, 13, 9]]