2015-05-12 3 views
2

У меня есть JSON с одним объектом для трафика каждого сайта за 3 даты.Преобразование массива объектов в Ruby

Я хочу объединить эти три объекта вместе «Дата». Пример ниже.

Я использую Ruby. Каков самый простой способ сделать это?

Начало JSON:

[ 
    { 
     "Google":[ 
     { 
      "Date":"2015-01-01", 
      "Value":100 
     }, 
     { 
      "Date":"2015-02-01", 
      "Value":200 
     }, 
     { 
      "Date":"2015-03-01", 
      "Value":300 
     } 
     ] 
    }, 
    { 
     "Yahoo":[ 
     { 
      "Date":"2015-01-01", 
      "Value":1200 
     }, 
     { 
      "Date":"2015-02-01", 
      "Value":1300 
     }, 
     { 
      "Date":"2015-03-01", 
      "Value":1400 
     } 
     ] 
    }, 
    { 
     "Bing":[ 
     { 
      "Date":"2015-01-01", 
      "Value":500 
     }, 
     { 
      "Date":"2015-02-01", 
      "Value":600 
     }, 
     { 
      "Date":"2015-03-01", 
      "Value":700 
     } 
     ] 
    } 
] 

Конец JSON:

[ 
    { 
    "Date":"2015-01-01", 
    "Google":100, 
    "Yahoo":1200, 
    "Bing":500 
    }, 
    { 
    "Date":"2015-01-02", 
    "Google":200, 
    "Yahoo":1200, 
    "Bing":600 
    }, 
    { 
    "Date":"2015-01-03", 
    "Google":300, 
    "Yahoo":1400, 
    "Bing":700 
    } 
] 
+0

я хотел бы использовать карту уменьшить в Монго для этого, но если вы хотите в Ruby, думать о http://ruby-doc.org/core-2.2.2/ Enumerable.html # method-i-group_by и JSON parse/dump – CodeGroover

+0

Я не вижу никаких вопросов JSON в вопросе. –

+0

@undur_gongor Автор упомянул, что у него есть данные json. – CodeGroover

ответ

5
result = array.inject({}) do | a, e | 
    site, data = e.first 
    data.each do | x | 
    a[x[:Date]] ||= {} 
    a[x[:Date]][site] = x[:Value] 
    end 
    a 
end 

дает вам хэш с датами в виде ключей. Это может быть преобразовано в массив с помощью:

result.map { | k, v | v.update(:Date => k) } 
+0

И часть накопления a [x [: Дата]] [сайт]? a [x [: Дата]] [сайт] + = x [: Значение]: x [: Значение], а также конечным результатом является массив – CodeGroover

+0

также после разбора JSON с ключами, поскольку строки не являются символами. – CodeGroover

+0

@CodeGroover: Вы правы с замечанием array-vs-hash. Спасибо. –

0

Предполагая, что именно эта структура, что может работать в

results = [] 

your_array[0]['Google'].each_with_index do |item, index| 
    date = item['Date'] 

    provider_values = your_array.inject({}) do |memo, current| 
    provider = current.keys[0] 
    value = current[provider][index]['Value'] 

    memo[provider] = value 
    memo 
    end 
    results.push({'Date' => date}.merge(provider_values)) 
end 

Я в настоящее время на Windows, поэтому я не могу быть 100% s однако исправление любых синтаксических ошибок должно быть простым.