【问题标题】:How to re-order an array of objects based on a list of ids如何根据 id 列表重新排序对象数组
【发布时间】:2015-04-12 16:28:08
【问题描述】:

我有一个对象任务,如下所示:

class Task
  include HTTParty

  attr_accessor :id, :name, :assignee_status, :order

  def initialize(id, name, assignee_status)
    self.id = id
    self.name = name
    self.status = status
    self.order = order
 end
end

所以,当我加载任务列表时,我会给它们一个特定的顺序,如下所示:

i = 0
@tasks.each do |at|
    at.order = i
    i += 100
end    

然后,此列表通过 json 发送到客户端应用程序,该应用程序向用户显示并允许拖放。在某些任务被重新排序后,前端应用程序会向服务器发送一个列表,其中包含新顺序中的所有任务 ID。

示例: 23,45,74,22,11,98,23

我想要做的是根据我找到的 id 重新排序对象数组。我想做的是将所有顺序设置为 0,然后在矩阵上单独搜索每个对象并相应地设置它们的优先级。但这只是感觉不对……感觉计算密集型。

有没有聪明的方法来做类似的事情:

ArrayOfTaskObjects.orderbyAttribute(id) ??

【问题讨论】:

    标签: ruby arrays ruby-on-rails-3 sorting


    【解决方案1】:

    也许最简单的方法是使用索引迭代参数,例如:

    params['task_ids'].split(",").each_with_index do |task_id, idx|
      task = lookup_the_task_based_on_id
      task.order = idx
    end
    

    【讨论】:

      【解决方案2】:
      def sort_by_id(array)
      
        r = array.inject({}) { |hash, element| hash.merge!(element.id => element) }
        temp_array = r.sort_by {|k,_| k}
        temp_array.flatten!.grep(temp_array.last.class)
      
      end
      

      发生了什么:

      sort_by_id 方法接受一个对象数组——这是你的任务数组。

      在第一行代码中,创建了一个散列,其中将每个任务 id 存储为键,将任务对象存储为值。

      第二行代码根据键对哈希进行排序(注意 r.sort_by 方法返回一个二维数组,例如[[23, Task], [44, Task], [54, Task]])。

      最后,第三行代码将二维数组展平为一维数组,然后 greps 从二维数组中删除所有 id,使任务数组按顺序排列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-26
        相关资源
        最近更新 更多