2016-10-10 5 views
0

Heres мой установитьКак проверить значение Hash в массиве?

project_JSON = JSON.parse 

teamList = Array.new 

project = Hash.new() 
project["Assignee Name"] = issue["fields"]["assignee"]["displayName"] 
project["Amount of Issues"] = 0 

if !teamList.include?(issue["fields"]["assignee"]["displayName"]) 
    project_JSON.each do |x| 
     project["Amount of Issues"] += 1 
     teamList.push(project) 
end 

Im возникли проблемы с этой линией.

if !teamList.include?(issue["fields"]["assignee"]["displayName"]) 

Он всегда возвращает истину даже после .push. Я хочу создать массив членов моей команды и указать, сколько раз их имя появляется в моем JSON. Что я делаю неправильно и как я динамически ссылаюсь на значение хэша в выражении if (там, где я думаю, что это неправильно, потому что, если я говорю .include?(issue["fields"]["assignee"]["displayName"]) неправильно, то его nil и оператор if всегда будут true)?

ответ

0

В вашем коде teamList есть пустой массив, поэтому он не include? ничего, он всегда будет возвращать false. Теперь, поскольку вы используете оператор !, он всегда возвращает true.

EDIT

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

Ниже способ сделать это, заметьте, я заменил ключи символов, как это хорошая практика в Ruby:

issue = { 
    :fields => { 
     :assignee => { 
      :displayName => 'tiago' 
     } 
    } 
} 

teamList = Array.new 

def teamList.has_assignee?(assignee) 
    self.each do |e| 
     return e[:assignee] == assignee 
    end 
    false 
end 


project = Hash.new 
project[:assigneeName] = issue[:fields][:assignee][:displayName] 
project[:amountOfIssues] = 0 

teamList.push(project) unless teamList.has_assignee? issue[:fields][:assignee][:dsiplayName] 
teamList.push(project) unless teamList.has_assignee? issue[:fields][:assignee][:dsiplayName] 


puts teamList.inspect # only one object here 

Как Серхио отметил, вы можете использовать .detect

def teamList.has_assignee?(assignee) 
     self.detect { |e| e[:assigneeName] == assignee } 
end 
+0

тогда толкает hashset в массив teamList, который дает оператору if что-то сравнивать, и даже тогда он возвращает true; thats, где моя проблема лежит – EXC3ll3NTrhyTHM

+0

@ EXC3ll3NTrhyTHM Я отредактировал свой ответ, так как я не знаю вашего набора данных, мне нужно было создать объект проблемы – Tiago

+1

лучше использовать '.detect' для реализации' has_assignee? ' –