我有一个包含多个值的数组,我希望将其中一些拆分为单独的条目。
array = [ 'foo', 'frob & baz', 'bar' ] # I want to split these with ' & ' as a delimiter, to get this output: result = [ 'foo', 'frob', 'baz', 'bar' ]
字符串我宁愿避免显式枚举整个数组。
w8rqjzmb1#
不遍历数组是不可能解决这个问题的。你必须检查数组中的每个元素,以检查它是否包含数组。无论你如何切片和切割,“检查每个元素”只是“遍历数组”的另一种说法。我的方法是对数组的所有元素进行map,然后通过split:
map
split
array.map { _1.split(' & ') } #=> [['foo'], ['frob', 'baz'], ['bar']]
字符串正如你所看到的,这几乎给了我们想要的结果,只是多了一层嵌套,我们可以用flatten删除:
flatten
array.map { _1.split(' & ') }.flatten(1) #=> ['foo', 'frob', 'baz', 'bar']
型然而,map和flatten的组合是浪费的,并且不是很有意图。有一个标准方法存在于几乎每种语言的几乎每一个集合库中,它正好满足我们的需要:flat_map:
flat_map
array.flat_map { _1.split(' & ') } #=> ['foo', 'frob', 'baz', 'bar']
型如果我们使用的是Rubocop,它会警告我们这一点(使用可选的 rubocop-performance 扩展),甚至会自动更正!
lbsnaicq2#
您可以将数组的成员拆分为该数组中的单独条目,方法是首先使用拆分成员所依据的对象连接数组,然后使用该对象拆分数组。
array = [ 'foo', 'frob & baz', 'bar' ] result = array.join(' & ').split(' & ')
字符串
2条答案
按热度按时间w8rqjzmb1#
不遍历数组是不可能解决这个问题的。你必须检查数组中的每个元素,以检查它是否包含数组。无论你如何切片和切割,“检查每个元素”只是“遍历数组”的另一种说法。
我的方法是对数组的所有元素进行
map
,然后通过split
:字符串
正如你所看到的,这几乎给了我们想要的结果,只是多了一层嵌套,我们可以用
flatten
删除:型
然而,
map
和flatten
的组合是浪费的,并且不是很有意图。有一个标准方法存在于几乎每种语言的几乎每一个集合库中,它正好满足我们的需要:flat_map
:型
如果我们使用的是Rubocop,它会警告我们这一点(使用可选的 rubocop-performance 扩展),甚至会自动更正!
lbsnaicq2#
您可以将数组的成员拆分为该数组中的单独条目,方法是首先使用拆分成员所依据的对象连接数组,然后使用该对象拆分数组。
字符串