ruby-on-rails - 在嵌套集中排序
问题描述
Parent 1
|
|-Child 1
|- - Child 1_GrandChild1
|
|-Child 2
|
Parent 2
|
|-Child 1
|- - Child 1_GrandChild1
|- - Child 1_GrandChild2
|
|-Child 2
|
|-Child 3
|- - Child 3_GrandChild1
|
Parent 3
我想按字母顺序对这个嵌套的集合结构进行排序,父母应该先排序,然后是孩子,然后是孙子。
这已经在 Rails 中令人敬畏的嵌套设置 gem 中实现了,但它并没有按排序顺序给我孙子,只有父母按排序顺序。我还尝试在模型部分使用 order_column 属性,但得到了相同的结果——父母被排序,但孙子没有。我还检查了这里和这里提到的问题,但没有帮助。我们如何解决这个问题?
编辑:所以它是一个对象数组。
输入:
A
- C
- B
Output:
A
- B
- C
问题是如果我有孙子,现有的实现不会对其进行排序。
解决方案
我真的不知道以下是否是您正在寻找的,但如果不是,也许您可以根据您的需要调整它。
str =<<~END
Parent 1
|
|-Child 1
|- - Child 1_GrandChild1
|
|-Child 2
|
Parent 2
|
|-Child 1
|- - Child 1_GrandChild1
|- - Child 1_GrandChild2
|
|-Child 2
|
|-Child 3
|- - Child 3_GrandChild1
|
Parent 3
END
str.each_line.with_object([]) do |s,arr|
s.chomp!
case s
when /\A\p{Alpha}+\s+\d+\z/
arr << [0,s]
when /\A \|\-\p{Alpha}+\s+\d+\z/
arr << [1,s[/[A-Z].*/]]
when /\A \|\- \- \p{Alpha}+ \d+\_\p{Alpha}+\d+\z/
arr << [2,s[/\d.*/]]
end
end.sort.map(&:last)
#=> ["Parent 1", "Parent 2", "Parent 3", "Child 1", "Child 1", "Child 2",
# "Child 2", "Child 3", "1_GrandChild1", "1_GrandChild1", "1_GrandChild2",
# "3_GrandChild1"]
注意
a = str.each_line.with_object([]) do |s,arr|
s.chomp!
case s
when /\A\p{Alpha}+\s+\d+\z/
arr << [0,s]
when /\A \|\-\p{Alpha}+\s+\d+\z/
arr << [1,s[/[A-Z].*/]]
when /\A \|\- \- \p{Alpha}+ \d+\_\p{Alpha}+\d+\z/
arr << [2,s[/\d.*/]]
end
end
#=> [[0, "Parent 1"], [1, "Child 1"], [2, "1_GrandChild1"],
# [1, "Child 2"], [0, "Parent 2"], [1, "Child 1"],
# [2, "1_GrandChild1"], [2, "1_GrandChild2"], [1, "Child 2"],
# [1, "Child 3"], [2, "3_GrandChild1"], [0, "Parent 3"]]
sort
,因此,首先对每个双元素数组的第一个元素进行排序,然后对第二个元素进行排序以打破平局:
b = a.sort
#=> [[0, "Parent 1"], [0, "Parent 2"], [0, "Parent 3"],
# [1, "Child 1"], [1, "Child 1"], [1, "Child 2"], [1, "Child 2"],
# [1, "Child 3"],
# [2, "1_GrandChild1"], [2, "1_GrandChild1"], [2, "1_GrandChild2"],
# [2, "3_GrandChild1"]]
最后,b.map(&:last)
将这些二元素数组中的每一个映射到数组的最后一个元素。