0

私はこのような配列を持っています:

tweets = [
  {
    :user_id => 234567,
    :username => "A",
    :created_at => "2012-10-12 10:20:30"
  },
  {
    :user_id => 234568,
    :username => "B",
    :created_at => "2012-10-12 10:20:34"
  },
  {
    :user_id => 234569,
    :username => "C",
    :created_at => "2012-10-12 10:20:35"
  },
  {
    :user_id => 234570,
    :username => "D",
    :created_at => "2012-10-12 10:20:40"
  }
]

次のような別の配列:

followers = [
  {
    :user_id => 234567,
    :follower_ids => [234568, 56654]
  },
  {
    :user_id => 234568,
    :follower_ids => [234569, 454445]
  },
  {
    :user_id => 234569,
    :follower_ids => [234570, 56333]
  },
  {
    :user_id => 234570,
    :follower_ids => [45566, 61145]
  }
]

私はそれを深い構造に入れ子にしたいと思っています。そこでは、あるものが別の子になります。子を作成するには、次の条件を満たす必要があります。

他のツイートよりも大きくcreated_atuser_idフォロワー配列内のそのツイートが子と見なされる場合、 follower_ids リストに含まれる他のツイート

指定されたデータの予想される出力は次のようになります。

arranged_tweets = [
  {
    :user_id => 234567,
    :username => "A",
    :created_at => "2012-10-12 10:20:30",
    :children => [
      {
        :user_id => 234568,
        :username => "B",
        :created_at => "2012-10-12 10:20:34",
        :children => [
          {
            :user_id => 234569,
            :username => "C",
            :created_at => "2012-10-12 10:20:35",
            :children => [
              {
                :user_id => 234570,
                :username => "D",
                :created_at => "2012-10-12 10:20:40"
              }
            ]
          }
        ]
      }
    ]
  }
]
4

1 に答える 1

1

テストされていませんが、アイデアが得られるはずです:

arranged_tweets = tweets.collect do |tweet|
  arranged_tweet(tweet, tweets - [tweet])          
end

def arranged_tweet(tweet, other_tweets)
  { :user_id => tweet[:user_id], ...
    :children => children(tweet, other_tweets) }
end 

def children(tweet, other_tweets)
  other_tweets.find_all { |other| is_child?(other, tweet) }.collect do |other|
    arranged_tweet(other, other_tweets - [other]) 
  end              
end

def is_child?(tweet, parent_tweet)
   parent_tweet[:created_at] > tweet[:created_at] && 
     is_follower?(tweet[:user_id], parent_tweet[:user_id])                                  
end

def is_follower?(user_id, other_user_id)
  followers[other_user_id][:follower_ids].include?(user_id)
end
于 2013-06-13T09:32:41.187 に答える