如何根据id列表重新排序对象数组

时间:2015-04-12 16:28:09

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

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

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)??

2 个答案:

答案 0 :(得分:0)

也许简单的方法是用索引迭代params,例如:

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

答案 1 :(得分:0)

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方法接受一个对象数组 - 这就是你的Task数组。

在第一行代码中创建一个哈希,它将每个Task id存储为键,将Task对象存储为值。

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

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