如何在 Ruby 中展开一个数组?

19

在Ruby中,我有一个数组的数组 c = [["a"], ["b"]]

如何将其转换为c = a + b

c = ["a", "b"]

对于任何数组。也许不使用其他变量是可能的。 所有数组内部都没有被压平。

d = [ [["a"], ["b"]], [["c"], ["d"]], [["e"], ["f"]] ] 

我需要 [ [["a"], ["b"], ["c"], ["d"], ["e"], ["f"]] ]


2
你现在说的是 Array#flatten 吗? - Andrew
flatten 对于数组嵌套数组来说并不好用。对于更深层次的 [[["a"], ["b"]]],我需要一个只能展开一层的 flatter。 - Eliasz Łukasz
我刚刚编辑了帖子,以使问题更清晰,我认为你也进行了编辑,你可能需要再次编辑。 - Kris
是的,在文档中它说“递归”。 - Kris
1
在第一个例子中,输入数组有2个深度级别,输出是一个平面数组(1个深度级别)。在第二个例子中,输入和输出数组均有3个深度级别。规则是什么? - axiac
如何将它转换为 c = a + b - 你是否在寻找 c.inject(:+) - Stefan
3个回答

29

Array#flatten也可以接受一个参数。

可选的level参数决定了扁平化的递归层数。

c = [[["a"]], [["b"]]]

c.flatten
# => ["a", "b"]

c.flatten(1)
# => [["a"], ["b"]]

这如何用于产生问题描述中的结果(对于所提供的两个示例)? - axiac
@axiac flatten 会生成 OP 的第一个例子的输出。第二个例子是一个打字错误(输入和输出相同)。OP 寻找的是一级展平,这在评论中已经提到了。 - Santhosh

4

使用flatten

返回一个新数组,该数组是此数组的一维展平(递归)。也就是说,对于每个元素,如果它是一个数组,则将其元素提取到新数组中。如果可选的level参数确定要展开的递归级别。

irb(main):001:0> a =  [["a"], ["b"]]
=> [["a"], ["b"]]
irb(main):002:0> a.flatten
=> ["a", "b"]

您可以通过控制递归级别flatten(n)

irb(main):001:0> c = [[["a"]], [["b"]]]
=> [[["a"]], [["b"]]]
irb(main):002:0> c.flatten 1
=> [["a"], ["b"]]
irb(main):003:0> 

0

Ruby:

c = [["a"], ["b"]]

将数组的数组转换为数组

c.flatten

获取二维数组的总和

c.flatten.sum

no. d = [[["a"], ["b"]], [["c"], ["d"]], [["e"], ["f"]]] => ["a", "b", "c", "d", "e", "f"] 我需要[[["a"], ["b"], ["c"], ["d"], ["e"], ["f"]]] - Eliasz Łukasz
这会删除更深层次的结构,这不是答案。 - Eliasz Łukasz
1
这将完成它 [d.flatten.collect { |x| [x] }] - Sandip Mane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接