将 x 元素移动到数组的末尾
Move x element to the end of an array
我试图找到一种方法来获取特定关系并将其移动到数组的末尾。基本上,我有一个 current_account
并且我想使用这个帐户并将其移动到帐户关系数组的末尾,以便在我对关系进行迭代时它会显示在最后。如果可能的话,我想制作一个范围并使用 SQL,这是我的尝试,但我还没有真正取得任何进展。
HTML
<% current_user.accounts.current_sort(current_account).each do |account| %>
<li><%= link_to account.name, switch_account_accounts_path(account_id: account.id) %></li>
<% end %>
当前 return 个按 created_at 个帐户排序的列表。我不希望它按 created at 排序,但 current_account
位于底部,所以我创建了一个名为 current_sort
的范围,但我不确定在这里做什么。
CURRENT_SORT 帐户范围
scope :current_sort, lambda { |account|
}
我希望此范围return 关联数组中最后传入的帐户。我如何使用 SQL 或 Ruby 执行此操作?
将特定元素排序到数组末尾的快速技巧是:
array.sort_by { |v| v == current_account ? 1 : 0 }
如果你想移动多个元素,这样做更容易:
to_end = [ a, b ]
array - to_end + to_end
编辑: 正如 Stefan 指出的那样,这可能会重新订购商品。要解决这个问题:
array.sort_by.with_index do |v, i|
v == current_account ? (array.length + i) : i
end
您也可以使用 partition
:
以不同的方式处理它
array.partition { |v| v != current_account }.reduce(:+)
这是 Stefan 在他们的回答中使用的方法的变体。
您可以使用partition
按条件拆分数组。
array = [1, 2, 3, 4, 5, 6, 7, 8]
current_account = 3
other_accounts, current_accounts = array.partition { |v| v != current_account }
#=> [[1, 2, 4, 5, 6, 7, 8], [3]]
other_accounts
#=> [1, 2, 4, 5, 6, 7, 8]
current_accounts
#=> [3]
结果可以串联:
other_accounts + current_accounts
#=> [1, 2, 4, 5, 6, 7, 8, 3]
或单行:
array.partition { |v| v != current_account }.flatten(1)
#=> [1, 2, 4, 5, 6, 7, 8, 3]
# or
array.partition { |v| v != current_account }.inject(:+)
#=> [1, 2, 4, 5, 6, 7, 8, 3]
我试图找到一种方法来获取特定关系并将其移动到数组的末尾。基本上,我有一个 current_account
并且我想使用这个帐户并将其移动到帐户关系数组的末尾,以便在我对关系进行迭代时它会显示在最后。如果可能的话,我想制作一个范围并使用 SQL,这是我的尝试,但我还没有真正取得任何进展。
HTML
<% current_user.accounts.current_sort(current_account).each do |account| %>
<li><%= link_to account.name, switch_account_accounts_path(account_id: account.id) %></li>
<% end %>
当前 return 个按 created_at 个帐户排序的列表。我不希望它按 created at 排序,但 current_account
位于底部,所以我创建了一个名为 current_sort
的范围,但我不确定在这里做什么。
CURRENT_SORT 帐户范围
scope :current_sort, lambda { |account|
}
我希望此范围return 关联数组中最后传入的帐户。我如何使用 SQL 或 Ruby 执行此操作?
将特定元素排序到数组末尾的快速技巧是:
array.sort_by { |v| v == current_account ? 1 : 0 }
如果你想移动多个元素,这样做更容易:
to_end = [ a, b ]
array - to_end + to_end
编辑: 正如 Stefan 指出的那样,这可能会重新订购商品。要解决这个问题:
array.sort_by.with_index do |v, i|
v == current_account ? (array.length + i) : i
end
您也可以使用 partition
:
array.partition { |v| v != current_account }.reduce(:+)
这是 Stefan 在他们的回答中使用的方法的变体。
您可以使用partition
按条件拆分数组。
array = [1, 2, 3, 4, 5, 6, 7, 8]
current_account = 3
other_accounts, current_accounts = array.partition { |v| v != current_account }
#=> [[1, 2, 4, 5, 6, 7, 8], [3]]
other_accounts
#=> [1, 2, 4, 5, 6, 7, 8]
current_accounts
#=> [3]
结果可以串联:
other_accounts + current_accounts
#=> [1, 2, 4, 5, 6, 7, 8, 3]
或单行:
array.partition { |v| v != current_account }.flatten(1)
#=> [1, 2, 4, 5, 6, 7, 8, 3]
# or
array.partition { |v| v != current_account }.inject(:+)
#=> [1, 2, 4, 5, 6, 7, 8, 3]