Как перебирать многомерные массивы с неопределенным методом `[] 'для nil: NilClass? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть такие данные массива:

work_list = {
    "data": {
        "1": {
            "team": "Design", 
            "members": nil, 
            "workload": {
                "process": {
                    "total": 50, 
                    "finish": 36, 
                    "un_finish": 14, 
                }
            } 
        },
        "2": {
            "team": "Account", 
            "members": 15, 
            "workload": {
                "process": {
                    "total": 30, 
                    "finish": 20, 
                    "un_finish": 10, 
                }
            } 
        }
    }
}  

Я хочу рассчитать общий объем работы обеих команд по:

list = work_list["data"]
count = 0

list.each do |num|
    num.each do |details|
       work = num["workload"]["process"]["total"]
       count += work
    end
end

puts "The total amount of works: #{count}"

Ошибка здесь: "неопределенный метод` each 'для nil: NilClass (NoMethodError) "

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы перебираете хеш, а не массив

list.each do |num, info|
  work = info["workload"]["process"]["total"]
  count += work
end
0 голосов
/ 07 мая 2018

Проблема с вашим кодом в том, что вы используете : для создания хеша:

"workload": {
  "process": {
    "total": 50, 
    "finish": 36, 
    "un_finish": 14, 
  }
}

Это допустимый синтаксис в Ruby, но ключи этого хеша будут символами, а не строками, как ожидалось, поэтому вам необходимо получить доступ к данным этого хеша с помощью символов:

data_hash = work_list[:"data"]
count = 0

data_hash.each do |index, data|
  work = data[:"workload"][:"process"][:"total"]
  count += work
end

puts "The total amount of works: #{count}"

Если вы хотите использовать строки, вам нужно создать хеш следующим образом:

"workload" => {
  "process" => {
    "total" => 50, 
    "finish" => 36, 
    "un_finish" => 14, 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...