【问题标题】:Ruby - elegantly flatten an array but don't ignore empty sub-arraysRuby - 优雅地展平数组,但不要忽略空子数组
【发布时间】:2017-07-11 14:32:13
【问题描述】:

使用.flatten 是一个方便的小技巧,可以将一组子数组转换为单个数组。 例如:[[1,3],2,[5,8]].flatten => [1,3,2,5,8] 你甚至可以包含 nil [1,[2,nil],3].flatten 将导致 [1,2,nil,3]

这种方法在嵌套.map 方法时非常有用,但是你如何解释一个空的子数组呢?例如:[1,[2,3],[],4].flatten 将返回 [1,2,3,4]... 但如果我需要跟踪空子数组可能会将结果转换为 [1,2,3,0,4][1,2,3,nil,4]

有什么优雅的方法可以做到这一点吗?还是我需要编写一些方法来遍历每个单独的子数组并一一检查?

【问题讨论】:

  • 是否需要检查嵌套的空数组,即[1, [2, 3, []], 4]

标签: arrays ruby flatten sub-array


【解决方案1】:

如果不需要递归检查嵌套子数组:

[1,[2,3],[],4].map { |a| a == [] ? nil : a }.flatten

【讨论】:

  • 这比我拥有的要干净一些。我将 a == [] 更改为 a.any?但类似的概念......出于某种原因,我总是忽略将逻辑放入我的 .map 块中。
  • @jkessluk 不会吗?窒息不是数组的项目?
  • 是的,但我在帮助方法中使用它,我已经确保通过的项目是一个数组。否则,是的。你是对的。
【解决方案2】:

先将空数组映射到nils,然后展平

[1,2,[1,2,3],[]].map{|x| if x.is_a? Array and x.empty? then nil else x end}.flatten

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 2017-01-14
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 2012-11-14
    • 2017-05-15
    • 2016-05-27
    相关资源
    最近更新 更多