如何根据下一个值对ruby对象进行分组

Mat*_*iby 0 ruby loops ruby-on-rails

好的,我有这个对象数组

pry(main)> @something.objects
=> [#<Object id: 2, position: 1, some_type: "Header", entryable_id: 6>,
=> [#<Object id: 3, position: 2, some_type: "Content", entryable_id: 32>,
=> [#<Object id: 4, position: 3, some_type: "Content", entryable_id: 11>,
=> [#<Object id: 6, position: 4, some_type: "Header", entryable_id: 15>,
=> [#<Object id: 7, position: 5, some_type: "Content", entryable_id: 41>,
=> [#<Object id: 8, position: 6, some_type: "Header", entryable_id: 109>,
Run Code Online (Sandbox Code Playgroud)

我想要的是与下一个内容组合在一起的标题

[{
  header: #<Object id: 2, position: 1, some_type: "Header", entryable_id: 6, 
  content: [#<Object id: 3, position: 2, some_type: "Content", entryable_id: 32>, #<Object   id: 4, position: 3, some_type: "Content", entryable_id: 11>]}, 
  header: #<Object id: 6, position: 4, some_type: "Header", entryable_id: 15>, 
  content: [#<Object id: 7, position: 5, some_type: "Content", entryable_id: 41>],
  content: #<Object id: 8, position: 6, some_type: "Header", entryable_id: 109>
]
Run Code Online (Sandbox Code Playgroud)

所以基本上所有的对象都有一个位置,我想用下一个"内容"将所有Header分组,直到另一个标题出现...我想要只是循环遍历对象并创建一个哈希数组但我想知道如果有最佳的使用方式,可能使用DB或其他方法

Rea*_*onk 7

slice_before 是你在找什么.

@something.slice_before {|e| e.some_type == "Header"}.flat_map { |h, *c| {:header => h, :content => c} }
Run Code Online (Sandbox Code Playgroud)

  • 我会添加`.flat_map {| h,*c | {:header => h,:content => c}}`以匹配问题 (2认同)