Arrays 实现阵列平坦化

Arrays 实现阵列平坦化,arrays,ruby,Arrays,Ruby,我需要实现数组#展平。此实现将删除所有嵌套数组: a = [1, 2, [3, [4, 5]]] def my_flatten(arr) arr.reduce([]) do |result, item| item.is_a?(Array) ? result + my_flatten(item) : result << item end end my_flatten(a) #=> [1, 2, 3, 4, 5] 很久以前我就创造了类似的东西。这是你的电话号

我需要实现
数组#展平
。此实现将删除所有嵌套数组:

a = [1, 2, [3, [4, 5]]]

def my_flatten(arr)
  arr.reduce([]) do |result, item| 
    item.is_a?(Array) ? result + my_flatten(item) : result << item
  end
end

my_flatten(a) #=> [1, 2, 3, 4, 5]

很久以前我就创造了类似的东西。这是你的电话号码

gist代码:

class Array
  def my_flatten(level = nil)
    rb_flatten(self, [], level)
  end

  private
  # apply recursion based on the level
  # when no level provided, then produce a complete flatten array
  # when level is given, then produce a flatten array flattened till that certain level
  def rb_flatten(array, result, level)
    array.each do |value|
      if ((value.is_a? Array) && (level.nil? || (level && level > 0)))
        rb_flatten(value, result, (level.nil? ? level : ((level || 0 ) - 1)))
      else
        result << value
      end
    end
    return result
  end
end
类数组
def my_展平(级别=零)
rb_展平(自身,[],水平)
结束
私有的
#基于级别应用递归
#如果未提供级别,则生成完整的展平阵列
#当级别给定时,生成一个展平数组,展平到该特定级别
def rb_展平(阵列、结果、级别)
数组。每个do |值|
if((value.is|a?数组)&&&(level.nil?| |(level&&level>0)))
rb|U展平(值、结果,(level.nil??level:((level | | 0)-1)))
其他的

结果引入一个参数来指定最大深度(默认为
nil
),并引入一个参数来跟踪当前深度(在初始调用时为0,然后在每次递归调用时递增1):

现在将返回预期结果:

 my_flatten(a) #=> [1, 2, 3, 4, 5]

 my_flatten(a, 1) #=> [1, 2, 3, [4, 5]]

您也可以像这样使用
Proc

class Array
  def my_flatten(level = nil)
    p = ->(arr, exp, lvl) do
      arr.each { |val| Array === val && (!level || lvl < level) ? p.(val, exp, lvl+1) : exp << val }
      exp
    end

    p.(self, [], 0)
  end
end

a = [1, 2, [3, [4, 5]]]
p a.my_flatten
# => [1, 2, 3, 4, 5]
p a.my_flatten(0)
# => [1, 2, [3, [4, 5]]]
p a.my_flatten(1)
# => [1, 2, 3, [4, 5]]
p a.my_flatten(2)
# => [1, 2, 3, 4, 5]
类数组
def my_展平(级别=零)
p=->(arr、exp、lvl)do
arr.each{val | Array==val&(!level | | lvl [1, 2, [3, [4, 5]]]
p.a.my_展平(1)
# => [1, 2, 3, [4, 5]]
p.a.my_展平(2)
# => [1, 2, 3, 4, 5]
def my_flatten(arr, max_depth = nil, current_depth = 0)
  arr.reduce([]) do |result, item|
    if item.is_a?(Array) && (max_depth.nil? || current_depth < max_depth)
      result + my_flatten(item, max_depth, current_depth + 1)
    else
      result << item
    end
  end
end
 my_flatten(a) #=> [1, 2, 3, 4, 5]

 my_flatten(a, 1) #=> [1, 2, 3, [4, 5]]
class Array
  def my_flatten(level = nil)
    p = ->(arr, exp, lvl) do
      arr.each { |val| Array === val && (!level || lvl < level) ? p.(val, exp, lvl+1) : exp << val }
      exp
    end

    p.(self, [], 0)
  end
end

a = [1, 2, [3, [4, 5]]]
p a.my_flatten
# => [1, 2, 3, 4, 5]
p a.my_flatten(0)
# => [1, 2, [3, [4, 5]]]
p a.my_flatten(1)
# => [1, 2, 3, [4, 5]]
p a.my_flatten(2)
# => [1, 2, 3, 4, 5]