将数组展平为深度之一

时间:2018-03-10 20:45:24

标签: crystal-lang

我尝试使用一种深度展平方法

  

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

     

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

     

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

     

[1, 2] => [1, 2]

将我的代码更新为

def flatten(array)
    result = [] of typeof(array) | typeof(array.first)

    array.each do |item|
      if item.is_a?(Array)
        result = ([] of typeof(item) | typeof(item.first)) + result
        result.concat(item)
      else
        result << item
      end
    end

    result
  end

但是展平([1,2])无法引发异常https://play.crystal-lang.org/#/r/3p6h

https://github.com/crystal-lang/crystal/issues/5805

1 个答案:

答案 0 :(得分:2)

为了安全起见,您需要数组类型及其元素类型的并集:

def unwrap(array)
  result = [] of typeof(array)|typeof(array.first)
  array.each do |item|
    if item.is_a?(Array)
      result.concat item
    else
      result << item
    end
  end
  result
end