在Ruby多维数组中查找和替换

Zag*_*g.. 2 ruby arrays multidimensional-array

在多维数组中是否有一种优雅的方法来查找和替换优于3(例如)的任何整数?阵列可以具有尺寸1,2,3或更多.只是这样一个数组的一个例子:

[ [ [ 3, 3, 5 ], 
    [ 4, 3, 3 ] ], 
  [ [ 3, 2, 3 ], 
    [ 0, 3, 8 ] ] ]
Run Code Online (Sandbox Code Playgroud)

我想这样做而不会压扁阵列.

i-b*_*lis 5

根据sepp2k的想法,这是一个可能的实现:

class Object
  def deep_map(&block)
    if self.respond_to? :each
      result = []
      self.each do |e|
        result << e.deep_map(&block)
      end
      return result
    else
      return block.call(self)
    end
  end  
end
Run Code Online (Sandbox Code Playgroud)

然后根据需要在数组上应用deep_map:

> [[[3, 3, 5], [4, 3, 3]], [[3, 2, 3], [0, 3, 8]]].deep_map { |e| e > 3 ? 0 : e }
=> [[[3, 3, 0], [0, 3, 3]], [[3, 2, 3], [0, 3, 0]]] 
Run Code Online (Sandbox Code Playgroud)

或者,更简单地说:

class Object
  def deep_map(&block)
    respond_to?(:map) ? map{|e| e.deep_map(&block)} : block.call(self)
  end
end
Run Code Online (Sandbox Code Playgroud)

或者,多态:

class Object
  def deep_map(&block); block.call(self) end
end

class Array
  def deep_map(&block); map{|e| e.deep_map(&block)} end
end
Run Code Online (Sandbox Code Playgroud)

  • 你也可以像我添加的那样以多态方式进行. (2认同)