我有一个Ruby对象数组,如何根据这些对象的属性将这个数组更改为多个数组?

Jus*_*ner 3 ruby arrays algorithm

根据原始数组中对象的属性,将大数组更改为多个子数组的最佳方法是什么?例如,我有一个对象数组(所有对象都具有相同的属性):

array = [
    {:name => "Jim", :amount => "20"},
    {:name => "Jim", :amount => "40"},
    {:name => "Jim", :amount => "30"},
    {:name => "Eddie", :amount => "7"},
    {:name => "Eddie", :amount => "12"},
    {:name => "Pony", :amount => "330"},
    {:name => "Pony", :amount => "220"},
    {:name => "Pony", :amount => "50"}
]
Run Code Online (Sandbox Code Playgroud)

请注意,具有相同名称属性的所有对象在数组中都是连续的.现在我想基于name属性将对象分组为子数组.我需要的是:

result = [
    [
        {:name => "Jim", :amount => "20"},
        {:name => "Jim", :amount => "40"},
        {:name => "Jim", :amount => "30"}
    ],
    [
        {:name => "Eddie", :amount => "7"},
        {:name => "Eddie", :amount => "12"}
    ],
    [
        {:name => "Pony", :amount => "330"},
        {:name => "Pony", :amount => "220"},
        {:name => "Pony", :amount => "50"}
    ]
]
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?谢谢.

mu *_*ort 9

使用group_by的重型起重,然后map拔出你想要什么:

result = array.group_by { |h| h[:name] }.map { |k, v| v }
Run Code Online (Sandbox Code Playgroud)

例如:

>> results = array.group_by { |h| h[:name] }.map { |k, v| v }
>> pp results
[[{:name=>"Jim", :amount=>"20"},
  {:name=>"Jim", :amount=>"40"},
  {:name=>"Jim", :amount=>"30"}],
 [{:name=>"Eddie", :amount=>"7"},
  {:name=>"Eddie", :amount=>"12"}],
 [{:name=>"Pony", :amount=>"330"},
  {:name=>"Pony", :amount=>"220"},
  {:name=>"Pony", :amount=>"50"}]]
Run Code Online (Sandbox Code Playgroud)

您也可以跳过map并直接进入Hash#values:

result = array.group_by { |h| h[:name] }.values
Run Code Online (Sandbox Code Playgroud)

感谢KandadaBoggu指出这种疏忽.

  • 也许你可以通过在`group_by`结果上调用`values`来进一步缩短它,即`array.group_by {| h | h [:name]} .values` (2认同)