我想将一个函数应用于数组所有级别的每个值:
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]
最好的方法是什么?
答案 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]