Как проверить наличие хеш-значения в массиве?

#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