我有一个按最近修改日期排序的帖子列表。我想将它们分成两列,将最近修改的两个帖子放在顶部。这段代码非常自我解释:
posts.each do |post|
right_column << post if shift
left_column << post if !shift
shift = shift ? false : true
end
posts = left_column + right_column
例如,根据输入 [1, 2, 3, 4]
,目标是生成[1, 3, 2, 4]
。
在Ruby中有更优雅/惯用的方法吗?
答案 0 :(得分:4)
使用each_slice
获取行,然后transpose
将其添加到列中,然后使用flatten
:
posts = (1..10).to_a #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
posts.each_slice(2).to_a.transpose.flatten
#=> [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
或者,分别获取左右列:
left, right = posts.each_slice(2).to_a.transpose
答案 1 :(得分:1)
<强>更新强>
我注意到您只需将left_column
和right_column
作为临时变量。
您可能更喜欢这个
posts = %W{ A B C D E F G H I J}
indices = posts.each_index.partition(&:even?).flatten
posts = posts.values_at(*indices)
p posts
<强>输出强>
["A", "C", "E", "G", "I", "B", "D", "F", "H", "J"]
如果你使用each_with_index
,你可以推送到不同的数组,具体取决于索引是偶数还是奇数
posts.each_with_index do |post, i|
(i.even? ? left_column : right_column) << post
end