将二维数组分组

3

我有以下类型的数组

[[y,x], [y,w], [m,e], [m,t],[a,b]]

我该如何将其转换为:
[[y, [x,w]], [m, [e,t]], [a,[b]]

基本上是通过它们的第一个元素对所有数组进行分组。
2个回答

3

使用Enumerable#group_by方法:

a = [['y','x'], ['y','w'], ['m','e'], ['m','t'],['a','b']]
a.group_by(&:first).map { |c, xs| [c, xs.map(&:last)] }
# => [["y", ["x", "w"]], ["m", ["e", "t"]], ["a", ["b"]]]

0

我需要这个关于grouped_options_for_select的问题和答案,以便我的表单选择使用optgoup按类别排列我的产品列表,使事情变得更加用户友好。

所有的例子都使用极其低效的查询来填充分组选项。我知道肯定有一些更高效的方法 - 只需一个数据库查询即可填充grouped_options_for_select所需的二维数组。我已经找了一段时间,所以很高兴能找到这个帖子。

感谢@falsetru。 这是我的解决方案。

控制器:

@product = params[:product]
products = Product.joins(:product_type).pluck('product_types.name', :name)
@grouped_products = products.group_by { |product_type| product_type.shift }

我发现这些例子非常有帮助:http://jelera.github.io/howto-work-with-ruby-group-by 对于分组选项,我不需要做最后的展开,因为我们可能希望每个元素都有一个显示/值对(你可以在:name之后直接取出)。
HTML/ERB:
<select name="product" id="product" class="form-select">
   <%= grouped_options_for_select(@grouped_products, @product) %>
</select>

我知道这与问题不完全相关,但我想在这里留下我的答案,以防对于像我一样处境相似的人有所帮助。


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