【问题标题】:Group an array of hashes by two conditions with Ruby使用 Ruby 按两个条件对哈希数组进行分组
【发布时间】:2014-01-21 15:21:11
【问题描述】:

我有一个这样的哈希数组,我已经删除了一些记录以用于演示目的。

[
  {
    "id"=>425343308605714432, 
    "text"=>"Hello", 
    "sender"=> {
      "id"=>1375480994, 
      "name"=>"Rocket"
    }, 
    "sender_id"=>1375480994, 
    "recipient"=> {
      "id"=>24766510,
      "name"=>"Max Rose-Collins"
    }, 
    "recipient_id"=>24766510, 
    "recipient_id_str"=>"24766510", 
    "recipient_screen_name"=>"maxrosecollins", 
    "created_at"=>"Mon Jan 20 19:05:21 +0000 2014" 
  },
  {
    "id"=>413305410666639361,  
    "text"=>"How are you", 
    "sender"=> {
      "id"=>24766510,  
      "name"=>"Max Rose-Collins"
    }, 
    "sender_id"=>24766510, 
    "sender_screen_name"=>"maxrosecollins", 
    "recipient"=> {
      "id"=>1375480994, 
      "name"=>"Rocket"
    }, 
    "recipient_id"=>1375480994, 
    "recipient_id_str"=>"1375480994", 
    "recipient_screen_name"=>"Rocket", 
    "created_at"=>"Wed Dec 18 13:51:03 +0000 2013"
  }
]

这个哈希数组还包含其他用户之间的其他消息。 我想将此安排到包含两个用户之间发送和接收的消息的对话中。 我试过使用

.group_by { |r| [r['recipient_id'], r['sender_id']] }

但这并没有按照我的想法对他们进行分组。它使两组一组发送,另一组接收。

{
  [1375480994, 24766510]=>[removed for presentation], 
  [24766510, 1375480994]=>[removed for presentation],
  [24766510, 146385359]=>[removed for presentation],
  [146385359, 24766510]=>[removed for presentation],
}

如何将这两个哈希合并为一个,以便将整个对话集中在一个地方,就像线程对话一样?

【问题讨论】:

  • 你不能只对 group_by 进行排序吗? [r['recipient_id'], r['sender_id']].sort。然后你就得到每个组和sort_by“created_at”值
  • 啊,是的,我可以。抱歉,我还在学习 :) 谢谢!
  • 没问题,我将其添加为答案,因为它正是您要查找的内容。

标签: ruby-on-rails ruby arrays hash


【解决方案1】:

为了按对话对它们进行分组,您可以将sort 方法添加到group_by 函数:

.group_by{ |r| r.values_at('recipient_id', 'sender_id').sort }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2016-07-06
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多