2013-12-01 4 views
-2

У меня есть два хэшей ..Добавить хэш-значения в вложенной хэш - Регистрация Вложенные хэши рубин

[ 
    { 
     "title"=>"CEO", 
     "name"=>"George", 
     "columns"=>[ 
     { 
     "display_name"=> "Salary", 
     "value"=>"3.85", 
     } 
    , { 
     "display_name"=> "Bonus", 
     "value"=>"994.19", 
     } 
    , { 
     "display_name"=> "Increment", 
     "value"=>"8.15", 
     } 
        ] 
    } 
] 


data2 = JSON.parse(data2)['info'] 
puts data2 

[ 
    { 
     "title"=>"CEO", 
     "name"=>"George", 
     "columns"=>[ 
     { 
     "display_name"=> "Address", 
     "value"=>"Albany", 
     } 
    , { 
     "display_name"=> "Phone", 
     "value"=>"47123", 
     } 
    , { 
     "display_name"=> "Mobile", 
     "value"=>"784123", 
     } 
        ] 
    } 
] 

Я хочу присоединиться значения внутри «столбцы» в один хэш, если условия будут выполнены, как имя = джордж в как хэши

требуемый выходной быть как

[ 
    { 
     "title"=>"CEO", 
     "name"=>"George", 
     "columns"=>[ 
     { 
     "display_name"=> "Salary", 
     "value"=>"3.85", 
     } 
    , { 
     "display_name"=> "Bonus", 
     "value"=>"994.19", 
     } 
    , { 
     "display_name"=> "Increment", 
     "value"=>"8.15", 
     } 
    , { 
     "display_name"=> "Address", 
     "value"=>"Albany", 
     } 
    , { 
     "display_name"=> "Phone", 
     "value"=>"47123", 
     } 
    , { 
     "display_name"=> "Mobile", 
     "value"=>"784123", 
     } 
         ] 
    } 
] 

То, что я попытался это зип, слияние, инъекционные, присоединиться, хэш глубокое слияние, но лучшее, что я могу получить новый Hash, который отбрасывает все первые значения и хранить конд

+0

Я хотел бы сказать вам нужен идентификатор для каждого из ваших записей, чтобы сравнить их при слиянии. – pduersteler

+0

"name" => "George" - может быть идентификатором? или имя-идентификатора - то же самое, что и значение дампа столбцов в первый хэш ... – Ajmal

ответ

0

Вы можете использовать Array#| объединить оба массива:

data.each do |item| 
    # find matching entry in data2 
    item2 = data2.find {|item2| item2['name'] == item['name'] } 
    # join both columns if matching data was found 
    item['columns'] = item['columns'] | item2['columns'] if item2 
end 

Это изменяет вашу data переменную, чтобы содержать столбцы как data и data2.

=> [{"title"=>"CEO", 
    "name"=>"George", 
    "columns"=> 
    [{"display_name"=>"Salary", "value"=>"3.85"}, 
    {"display_name"=>"Bonus", "value"=>"994.19"}, 
    {"display_name"=>"Increment", "value"=>"8.15"}, 
    {"display_name"=>"Address", "value"=>"Albany"}, 
    {"display_name"=>"Phone", "value"=>"47123"}, 
    {"display_name"=>"Mobile", "value"=>"784123"}]}] 

Блок в item2 = data2.find {|item2| item2['name'] == item['name'] } определяет, будет ли два элемента равны или нет. Вы можете изменить этот блок, чтобы сравнить другие значения (например, title), если хотите.


Для записи это, как я думаю, data и data2 определены:

data= [ 
    {"title"=>"CEO", 
    "name"=>"George", 
    "columns"=>[ 
     { 
      "display_name"=> "Salary", 
      "value"=>"3.85", 
     }, { 
      "display_name"=> "Bonus", 
      "value"=>"994.19", 
     }, { 
      "display_name"=> "Increment", 
      "value"=>"8.15", 
     } 
    ]} 
    ] 

data2 = [{ 
    "title"=>"CEO", 
    "name"=>"George", 
    "columns"=>[{ 
     "display_name"=> "Address", 
     "value"=>"Albany", 
    }, { 
     "display_name"=> "Phone", 
     "value"=>"47123", 
    }, { 
     "display_name"=> "Mobile", 
     "value"=>"784123", 
    }] 
}] 
+0

Большое спасибо ... У ур-вывода есть начальное название, имя и т. д. ... кажется, отсутствует ... – Ajmal

+0

Где вы ожидаете «название», «имя» и т. д.? Эти ассоциации все еще присутствуют в исходном массиве 'data'. – tessi

+0

Вы должны запустить все это, начиная с 'data.each' до' end'. Приведенное задание возвращает только хеш столбца, но он изменяет переменную 'data', как вы пожелаете. – tessi

Смежные вопросы