根据原始数组中对象的属性,将一个大数组更改为多个子数组的最佳方法是什么?例如我有一个对象数组(所有对象都具有相同的属性):
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"}
]
请注意,具有相同名称 属性的所有对象在数组中都是连续的。现在我想根据名称属性将对象分组到子数组中。我需要的是:
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"}
]
]
执行此操作的最佳方法是什么? 谢谢。
最佳答案
使用group_by
繁重的工作然后 map
拉出你想要的东西:
result = array.group_by { |h| h[:name] }.map { |k, v| v }
例如:
>> 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"}]]
您也可以跳过 map
,直接前往Hash#values
。 :
result = array.group_by { |h| h[:name] }.values
感谢转至 KandadaBoggu感谢您指出这一疏忽。
关于ruby - 我有一个 Ruby 对象数组,如何根据这些对象的属性将此数组更改为多个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9108222/