【问题标题】:How to combine the sorting of two arrays into one?如何将两个数组的排序合二为一?
【发布时间】:2019-09-06 08:50:18
【问题描述】:

如何将两个模型的排序代码合并为一个? 我有两个模型,作者和书籍。

我得到 Author 和 Book 数据,对其进行排序,最后将这两个数据连接起来。

sorted_author = author.sort do |a, b|
  if a.name.nil? || a.amount.nil?
    -1
  elsif b.name.nil? || b.amount.nil?
    1
  else
    [a.name, a.amount] <=> [b.name, b.amount]
  end
end

sorted_book = book.sort do |a, b|
  if a.data.nil? || a.price.nil?
    -1
  elsif b.data.nil? || b.price.nil?
    1
  else
    [a.data, a.price] <=> [b.data, b.price]
  end
end

sorted_author.concat(sorted_book)

问题是日期会分开排序,我需要两个数组作为一个排序。

我可以做这样的事情。

author.concat(book).sort_by do |a|
  if a.instance_of? Author
    [a.name, a.amount]
  else
    [a.data, a.price]
  end
end

但如果在这里,例如,名称、日期、价格为 nil,那么排序将以错误结束。

【问题讨论】:

  • 您现有的代码将所有书籍(排序)放在作者(排序)之后。如果您将concat 放在前面,那么与[2019 Sep 06, 50.00] 相比,您希望["Orwell", 100] 的位置如何?
  • 这有点像X&Y problem。您很可能应该对数据库中的记录进行排序,而不是将它们拔出并在无法扩展的 ruby​​ 中进行。我鼓励您少关注当前的解决方案,并提供模型和数据以及所需输出的示例。
  • @max 是什么让你觉得有数据库曾经

标签: ruby-on-rails ruby


【解决方案1】:

要复制您拥有的功能(所有作者,排序,在所有书籍之上,排序),您可以在 ruby​​ 中使用 nilfalsey

author.concat(book).sort_by do |a|
  if a.instance_of? Author
    [1, a.name || -1, a.amount || -1]
  else
    [0, a.data || -1, a.price || -1]
  end
end

请注意,我将1 用于作者,0 用于书籍以保留所有作者都排在所有书籍之前。

【讨论】:

  • 感谢您的回答,但我不需要保留当前功能。我仍然需要合并所有数据然后进行排序。我认为 "|| -1" 会解决问题。
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 2021-12-13
  • 2020-09-07
  • 1970-01-01
  • 2014-06-21
  • 2021-05-01
  • 1970-01-01
  • 2023-01-17
相关资源
最近更新 更多