我需要渲染数组的前5个元素的内容,并在网页上显示“和X更多”。在Array(或Enumerable)上是否有一个内置方法可以轻松地将一个数组分成两个子数组:第一个由最多固定大小组成,第二个由数组余数组成?
我正在寻找一个简单的方法调用来为我做这个。我查看的大多数方法(如Enumerable#partition
)使用逻辑条件来划分数组,并且不为块提供索引。
我刚写了下面的代码来做我想要的。请救我脱离自己,并指导我一个已经做到的方法。
class Array
def bifurcate(size=length)
if size < 0
raise ArgumentError, "attempt to bifurcate using negative size"
end
remainder_size = length - size
if remainder_size < 0
remainder_size = 0
end
[
first(size),
last(remainder_size)
]
end
end
('a'..'g').to_a.bifurcate(2)
# => [["a", "b"], ["c", "d", "e", "f", "g"]]
('a'..'g').to_a.bifurcate(20)
# => [["a", "b", "c", "d", "e", "f", "g"], []]
('a'..'g').to_a.bifurcate()
# => [["a", "b", "c", "d", "e", "f", "g"], []]
('a'..'g').to_a.bifurcate(0)
# [[], ["a", "b", "c", "d", "e", "f", "g"]]
('a'..'g').to_a.bifurcate(-1)
# ArgumentError: attempt to bifurcate using negative size
另外,让我限定我想要一个简单的方法调用来做我想要的。还要考虑起始数组可能包含重复值,此方法需要尊重原始数组并返回重复项。
答案 0 :(得分:4)
您可以使用Enumerable#partition
和Enumerator#with_index
方法,如下所示:
size = 2
(1..6).partition.with_index { |_,i| i < size }
#=> [[1, 2], [3, 4, 5, 6]]
或者,如果你的输入数组可以变异,那么,下面也会做一些技巧
[array.shift(size), array]
答案 1 :(得分:2)
[array.take(3), array.drop(3)]
# [["a", "b", "c"], ["d", "e", "f", "g"]]
希望有所帮助:)
答案 2 :(得分:1)
使用Array#[]:
[arr[0,size_of_first], arr[size_of_first..-1] || []]