Итерация по хешу Ruby при сравнении значений с другим хешем Ruby - PullRequest
1 голос
/ 07 марта 2012

У меня есть 2 объекта Ruby, которые я конвертирую в хэши: один из XML, а другой из JSON. Когда я puts имя переменной я получаю хэш, так что кажется, что я делаю это правильно.

Формат - несколько записей в формате ниже.

Формат хэша 1 (smithjj является уникальным именем пользователя):

{ smithjj => {office => 331, buidling => 1} }

Формат хэша 2:

{"Data"=>{"xmlns:dmd"=>"http://www.xyz.com/schema/data-metadata",
"dmd:date"=>"2012-03-06", "Record"=>{"PCI"=>{"DPHONE3"=>nil, "OPHONE3"=>"111",
"DTY_DOB"=>"1956", "TEACHING_INTERESTS"=>nil, "FAX1"=>"123", "ROOMNUM"=>"111",
"DTD_DOB"=>"5", "DTM_DOB"=>"11", "WEBSITE"=>"www.test.edu", "FAX2"=>"324", 
"ENDPOS"=>"Director", "LNAME"=>"Smith", "FAX3"=>"4891", "MNAME"=>"Thomas",
"GENDER"=>"Male", "ALT_NAME"=>nil, "PFNAME"=>"TG", "id"=>"14101823488", 
"RESEARCH_INTERESTS"=>nil, "BIO"=>"", "CITIZEN"=>"Yes", "EMAIL"=>"test@email", 
"SUFFIX"=>nil, "DPHONE1"=>nil}, "termId"=>"234", "IndexEntry"=>{"text"=>"Other", 
"indexKey"=>"DEPARTMENT", "entryKey"=>"Other"}, "dmd:surveyId"=>"23424", 
"username"=>"smithers", "userId"=>"23324"}, "xmlns"=>"http://www.adsfda.com/"}}

Я хочу перебрать каждое уникальное имя пользователя в первом хеше и сравнить значения из раздела PCI второго хэша со значениями в первом хэше. Ключи имеют разные названия, поэтому я планировал их объединить.

Я пробовал несколько способов сделать это, но я продолжаю получать строковое целочисленное значение, поэтому я не должен выполнять итерацию правильно. Я делаю блок .each do, но все примеры, которые я вижу, показывают простой хеш, а не key => key => value, key => value.

Любое направление высоко ценится.

1 Ответ

0 голосов
/ 07 марта 2012

Вот как вы должны быть в состоянии правильно выполнить итерацию для хэшей, если вы еще не используете это:

h = {:foo => 42, :bar => 43, 44 => :baz}
h.each {|key, val| puts "The value at #{key} is #{val}."}

Это производит:

The value at foo is 42.
The value at bar is 43.
The value at 44 is baz.

Что касается последней части вашего вопроса, не могли бы вы сделать это немного яснее? например, какую ошибку вы получаете именно? Это может помочь нам лучше понять проблему.

РЕДАКТИРОВАТЬ: Если вы хотите сравнить некоторые значения с другими, попробуйте что-то вроде этого:

h1 = {:foo => 42, :bar => 43, 44 => :baz, :not_used => nil}
h2 = {:life_universe => 42, :fourty_three => 45, :another_num => 44, :unused => :pancakes}
# Very easy to add more
comparisons = {:foo => :life_universe, :bar => :fourty_three, :baz => :another_num}
def all_match_up?(hash1, hash2, comps)
  comparisons.each {|key, val|
    if key != val
      # They don't match!
      puts "#{key} doesnt match #{val}!"
      return false
    end
  }
  # They all match!
  true
end
all_match_up?(h1, h2, comparisons)

Попробуйте посмотреть, что получится;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...