首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从数组中提取子数组和其余元素为Array?

如何从数组中提取子数组和其余元素为Array?
EN

Stack Overflow用户
提问于 2015-05-13 12:24:43
回答 5查看 347关注 0票数 3

假设我有一个数组

代码语言:javascript
复制
aoa = [1, 2, [3, 4], 5, [6, 7, 8], 9]

我想将数组和单个元素提取为如下数组

代码语言:javascript
复制
[[1,2,5,9],[3,4],[6,7,8]] #=>order is not important

我试过了,但不确定如何处理单个元素。

代码语言:javascript
复制
aoa.map{|i|  i if i.kind_of?(Array)}.compact #=> [[3, 4], [6, 7, 8]] 
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-05-13 12:30:52

您可以使用隔断 (以及@CarySwoveland指出的splat运算符)。

代码语言:javascript
复制
a, i = aoa.partition{ |i| i.is_a? Array }
# => [[[3, 4], [6, 7, 8]], [1, 2, 5, 9]] 
[*a, i]
# => [[3, 4], [6, 7, 8], [1, 2, 5, 9]]
票数 7
EN

Stack Overflow用户

发布于 2015-05-13 12:28:25

Enumerable#group_by返回一个Hash,它的值就是您想要的:

代码语言:javascript
复制
aoa.group_by(&:size).values.map(&:flatten)
# => [[1, 2, 5, 9], [3, 4], [6, 7, 8]]

@Cary Swoveland指出,使用size进行分组是个坏主意,因为与Fixnum#size大小相同的子数组会导致意外的结果。应该使用group_by(&:class)

票数 4
EN

Stack Overflow用户

发布于 2015-05-13 15:10:03

代码语言:javascript
复制
nested_a = [[]]
aoa.each {|e| e.is_a?(Array) ? nested_a << e : nested_a[0] << e  }
#remove 1st nested array if empty(Occurs if there were no individual elements)
nested_a.shift if nested_a[0].empty?
nested_a # => [[1, 2, 5, 9], [3, 4], [6, 7, 8]]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30214683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档