#arrays #ruby #key-value #hashset
#массивы #ruby #ключ-значение #hashset
Вопрос:
Вот моя настройка
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
У меня возникли проблемы с этой строкой.
if !teamList.include?(issue["fields"]["assignee"]["displayName"])
Он всегда возвращает true даже после .push
. Я хочу создать массив членов моей команды и перечислить, сколько раз их имя появляется в моем JSON. Что я делаю не так и как мне динамически ссылаться на значение хэша в операторе if (вот где я думаю, что это неправильно, потому что, если я говорю .include?(issue["fields"]["assignee"]["displayName"])
неправильно, тогда его значение равно нулю, а оператор if всегда будет истинным)?
Ответ №1:
В вашем коде teamList
есть пустой массив, поэтому он ничего не include?
делает, он всегда будет возвращаться false
. Теперь, поскольку вы используете !
operator, он всегда возвращает true.
Редактировать
Если вы правильно поняли, вам нужно выполнить цикл по массиву, проверяя каждый элемент на указанное значение.
Ниже приведен способ сделать это, имейте в виду, я заменил ключи на символы, поскольку это хорошая практика в 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
Комментарии:
1. затем он помещает hashset в массив teamList, который дает оператору if что-то для сравнения, и даже тогда он возвращает true; вот в чем заключается моя проблема
2. @EXC3ll3NTrhyTHM Я отредактировал свой ответ, поскольку я не знаю ваш набор данных, мне пришлось создать объект проблемы
3. лучше использовать
.detect
для реализацииhas_assignee?
4. @SergioTulentsev спасибо, что указали
.detect
на то, что вы взглянули на класс Enumerable ,.any?
его также можно использовать, на самом деле он лучше подходит, поскольку возвращает логическое значение5. Или, может быть, not
.detect
возвращается, как только блок возвращает true