【问题标题】:Group/filter sub-arrays of a multidimensional array in Ruby/RoR在 Ruby/RoR 中对多维数组的子数组进行分组/过滤
【发布时间】:2020-07-08 03:56:41
【问题描述】:

我有一个 Ruby on Rails 查询以 .pluck(:id, :title) 结尾,并给了我一个充满二维数组的数组,如下所示:

array = [[11145, "string1"], [11223, "string1"], [11205, "string2"], [11127, "string2"], [11080, "string3"], [11158, "string3"]]

我想按标题对 ID 进行分组以获得此结果:

 [[[11145, 11223], "string1"], [[11205, 11127], "string2"], [[11080, 11158], "string3"]]

我尝试在 SQL 查询中直接连接 ID 或操作数组,但没有管理我的预期结果。

我们非常欢迎任何帮助。 提前致谢。

【问题讨论】:

  • 请添加您目前尝试过的内容?

标签: arrays ruby multidimensional-array ruby-on-rails-5 filtering


【解决方案1】:

快速解决方案:

array.group_by(&:last).transform_values { |e| e.map(&:first) }.to_a
  1. Enumerable#group_by
  2. Hash#transform_values

另一种变体是:

array.each_with_object(Hash.new {|h,k| h[k] = [] }) do |obj, res|
  res[obj.last] << obj.first
end.to_a
  1. Hash#default_proc
  2. Enumerable#each_with_object

UPD 我不知道你的查询是什么样子,但如果你使用 PG,你可以尝试使用以下结尾:

.group(:title).select('array_agg(id) as ids, title').map { |e| [e.title, e.ids] }

【讨论】:

  • 非常感谢!您的 3 个选项完美运行!我无法混合使用这些方法来获得结果,对我来说太深了:)
  • 我相信第一行中的.to_a 是多余的。我不知道“更优化”是否比第一个解决方案更好(只是不同)。此外,优化后的返回值也不理想(排序不同)。
  • @CarySwoveland emm,不,没有.to_a,它将返回Hash。你是对的,我已经用基准重新检查了它,是的,看起来这两个变体都需要 +- 同一时间。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2012-06-10
  • 2021-11-28
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多