我这里有一些 Ruby 代码,可以工作,但我确定我没有尽可能高效地完成它。

我有一个对象数组,沿着这条线:

[ 
    { name: "foo1", location: "new york" }, 
    { name: "foo2", location: "new york" }, 
    { name: "foo3", location: "new york" }, 
    { name: "bar1", location: "new york" }, 
    { name: "bar2", location: "new york" }, 
    { name: "bar3", location: "new york" }, 
    { name: "baz1", location: "chicago" }, 
    { name: "baz2", location: "chicago" }, 
    { name: "baz3", location: "chicago" }, 
    { name: "quux1", location: "chicago" }, 
    { name: "quux2", location: "chicago" }, 
    { name: "quux3", location: "chicago" } 
] 

我想创建一些组 - 比如 3 - 每个组包含半等量的项目,但散布在 location 中。

我试过这样的:

group_size = 3 
groups = [] 
 
group_size.times do 
    groups.push([]) 
end 
 
i = 0 
objects.each do |object| 
    groups[i].push(object) 
    if i < (group_size - 1) 
        i += 1 
    else 
        i = 0 
    end 
end 

这将返回一个 groups 对象,看起来像:

[ 
    [{:name=>"foo1", :location=>"new york"}, 
     {:name=>"bar1", :location=>"new york"}, 
     {:name=>"baz1", :location=>"chicago"}, 
     {:name=>"quux1", :location=>"chicago"}], 
    [{:name=>"foo2", :location=>"new york"}, 
     {:name=>"bar2", :location=>"new york"}, 
     {:name=>"baz2", :location=>"chicago"}, 
     {:name=>"quux2", :location=>"chicago"}], 
    [{:name=>"foo3", :location=>"new york"}, 
     {:name=>"bar3", :location=>"new york"}, 
     {:name=>"baz3", :location=>"chicago"}, 
     {:name=>"quux3", :location=>"chicago"}] 
] 

因此您可以看到每个分组中的每个位置都有几个对象。

我尝试使用 each_slice()group_by(),甚至尝试使用 inject([]) - 但我不能'找不到更优雅的方法来做到这一点。

我希望这是我忽略的东西 - 我需要考虑更多的 location 和非偶数的对象。

请您参考如下方法:

是的,用 i 记账通常是一个标志,应该有更好的东西。我想到了:

ar =[ 
    { name: "foo1", location: "new york" }, 
    { name: "foo2", location: "new york" }, 
    { name: "foo3", location: "new york" }, 
    { name: "bar1", location: "new york" }, 
    { name: "bar2", location: "new york" }, 
    { name: "bar3", location: "new york" }, 
    { name: "baz1", location: "chicago" }, 
    { name: "baz2", location: "chicago" }, 
    { name: "baz3", location: "chicago" }, 
    { name: "quux1", location: "chicago" }, 
    { name: "quux2", location: "chicago" }, 
    { name: "quux3", location: "chicago" } 
] 
 
# next line handles unsorted arrays, irrelevant with this data  
ar = ar.sort_by{|h| h[:location]} 
 
num_groups = 3 
groups     = Array.new(num_groups){[]} 
wheel      = groups.cycle 
ar.each{|h| wheel.next << h} 
 
# done. 
p groups 
# => [[{:name=>"baz1", :location=>"chicago"}, {:name=>"quux1", :location=>"chicago"}, {:name=>"foo1", :location=>"new york"}, ...] 

因为我喜欢 cycle方法。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!