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

标签 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"}
]

请注意,具有相同名称 属性的所有对象在数组中都是连续的。现在我想根据名称属性将对象分组到子数组中。我需要的是:

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/

相关文章:

创建子进程可以访问的共享字符串数组

为图表选择代表性样本的算法

algorithm - 检测有向无环图中的汇点

ruby-on-rails - HTTP 请求参数名称中的连字符

ruby - 用别名包装继承的方法

c - `gdb` 给出了 `ret` 和自然返回的不同结果

Java:如何以极高的性能进行基于位置 (x,y) 的索引?

algorithm - 开发人员机器学习实用指南?

ruby - Ruby 1.9.1 中的 native 线程,对我有什么好处?

ruby 哈希将值从一个键交换到另一个键