迭代并映射多维数组

时间:2015-07-16 14:21:26

标签: arrays ruby

我想将一个函数应用于数组所有级别的每个值:

arr = [[1,2,3],[1,2,3],[[1,2],[1,2]],1,2,3]
例如,将所有值乘以3,并将其映射为与之前相同的格式,以便得到:

arr = [[3,6,9],[3,6,9],[[3,6],[3,6]],3,6,9]

最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

使用递归。如果元素是数组,则创建一个自动调用的方法,如果不是,则进行计算。

def walk_array(array)
  array.map do |element|
    if element.is_a?(Array)
      walk_array(element)
    else
      element * 3
    end
  end
end

arr = [[1,2,3],[1,2,3],[[1,2],[1,2]],1,2,3] 
# => [[1, 2, 3], [1, 2, 3], [[1, 2], [1, 2]], 1, 2, 3]

walk_array(arr) 
# => [[3, 6, 9], [3, 6, 9], [[3, 6], [3, 6]], 3, 6, 9]

答案 1 :(得分:0)

如果你愿意使用gem,我写了一个模块来提供这个功能:https://github.com/dgopstein/deep_enumerable

>> require 'deep_enumerable'
>> arr = [[1,2,3],[1,2,3],[[1,2],[1,2]],1,2,3]

>> arr.deep_map_values{|x| x*3}
=> [[3, 6, 9], [3, 6, 9], [[3, 6], [3, 6]], 3, 6, 9]