Как l oop через вложенный массив и получить значения - PullRequest
0 голосов
/ 10 января 2020

У меня есть следующий массив:

 my_tst = [
    [
        {
            "name": "shield",
            "version": "8.6.3"

        },
        {
            "name": "bosh-dns",
            "version": "1.17.0"
        },
        {
            "name": "nessus_agent",
            "version": "1.0.24"
        },
        {
            "name": "node-exporter",
            "version": "4.2.0"
        },
        {
            "name": "syslog",
            "version": "11.6.1"
        }
    ],
    [
        {
            "name": "shield",
            "version": "8.6.3"
        },
        {
            "name": "bosh-dns",
            "version": "1.16.0"
        },
        {
            "name": "nessus_agent",
            "version": "1.0.24"
        },
        {
            "name": "node-exporter",
            "version": "4.2.0"
        },
        {
            "name": "syslog",
            "version": "11.6.1"
        }
    ]
]

Я пытаюсь l oop через массив и выводить только значения имени. Я использовал это l oop:

my_tst["name"].each do |run|
    p run
end

l oop возвращает ошибку:

TypeError: no implicit conversion of String into Integer

Как вывести все значения во вложенном массиве?

1 Ответ

4 голосов
/ 10 января 2020

Вы пытаетесь использовать [] в массиве, который должен использоваться, передавая параметр Numberri c для доступа к его элементам по их индексу. Вы передаете строку, которая является способом получения значений из хэшей, и есть проблема.

У вас есть массив массивов, содержащих хэши (с интересным отступом), поэтому в этом случае вам нужно сначала выполните итерацию «основного» массива, чтобы иметь возможность получать хэши для каждого массива.

Это один из способов достижения этого:

my_tst.each_with_object([]) do |e, arr|
  e.each { |f| arr << f[:name] }
end
# ["shield", "bosh-dns", "nessus_agent", "node-exporter", "syslog", "shield", "bosh-dns", "nessus_agent", "node-exporter", "syslog"]

Или:

data.flat_map do |e|
  e.map { |f| f[:name] }
end

В любом случае, будет вложенная итерация.

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