Как взять сохранить части массива и сформировать новый массив? - PullRequest
0 голосов
/ 25 августа 2018

Я создаю приложение Rails 5.В этом приложении я подключился к API Календаря Google.Связь работает нормально, и я получаю список календарей обратно.Что мне нужно сделать, так это получить идентификатор и сводку этого объекта JSON, которые я получаю от Google.

Это то, что я получаю

    [{
        "kind": "calendar#calendarListEntry",
        "etag": "\"1483552200690000\"",
        "id": "xxx.com_asae@group.calendar.google.com",
        "summary": "My office calendar",
        "description": "For office meeting",
        "location": "344 Common st",
        "colorId": "8",
        "backgroundColor": "#16a765",
        "foregroundColor": "#000000",
        "accessRole": "owner",
        "defaultReminders": [],
        "conferenceProperties": {
            "allowedConferenceSolutionTypes": [
                "hangoutsMeet"
            ]
        }
    },
{
        "kind": "calendar#calendarListEntry",
        "etag": "\"1483552200690000\"",
        "id": "xxx.com_asae@group.calendar.google.com",
        "summary": "My office calendar",
        "description": "For office meeting",
        "location": "344 Common st",
        "colorId": "8",
        "backgroundColor": "#16a765",
        "foregroundColor": "#000000",
        "accessRole": "owner",
        "defaultReminders": [],
        "conferenceProperties": {
            "allowedConferenceSolutionTypes": [
                "hangoutsMeet"
            ]
        }
    }]

Это то, что я хочу получить в итоге

[{
    "id": "xxx.com_asae@group.calendar.google.com",
    "title": "My office calendar",
}]

Цель этого состоит в том, что я хочу заполнить поле выбора с помощью плагина Selectize

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Другой способ добиться удаления определенных ключей в вашем хэше - использовать метод Hash#reject:

response = { your_json_response }
expected = [response[0].reject {|k| k != :id && k != :summary}] 

Исходный ответ остается неизменным, пока возвращается измененная копия исходного ответа.

0 голосов
/ 26 августа 2018

Я предлагаю такой подход.

expected = response.each { |h| h.keep_if { |k, _| k == :id || k == :summary } }

Возвращает только необходимые пары:

# => [{:id=>"xxx.com_asae@group.calendar.google.com", :summary=>"My office calendar"}, {:id=>"xxx.com_asae@group.calendar.google.com", :summary=>"My office calendar"}]

Чтобы удалить дубликаты, просто сделайте expected.uniq

Если вам нужно изменить имя ключа: резюме на: title do:

expected = expected.each { |h| h[:title] = h.delete(:summary) }

Один вкладыш

expected = response.each { |h| h.keep_if { |k, _| k == :id || k == :summary } }.each { |h| h[:title] = h.delete(:summary) }.uniq

Конечно, может быть, лучше использовать .uniq как первый метод expected = response.uniq.each { .....

0 голосов
/ 25 августа 2018

Вы можете отфильтровать ключи назначения с помощью метода выбора:

responde = {your_json_response}
expected = [response[0].select{|k,v| ['id','title'].include?(k)}]

response[0] извлекает хеш, и выбор сравнивает каждый ключ с теми, которые вы хотите, и возвращает хэш только с этим ключом:пары значений.

РЕДАКТИРОВАТЬ: я пропустил, что у вас нет ключа "заголовка" в исходном ответе, я бы сделал это тогда:

response = {your_json_response}
h = response[0]
expected = [{'id' => h['id'], 'title' => h['summary']}]

РЕДАКТИРОВАТЬ 2: Извините,В первом примере было неясно, что будет несколько хешей

expected = response.map{|h| {'id' => h['id'], 'title' => h['summary']}}

map итераций по каждому элементу response и возвращает результат блока, примененного для каждой итерации, в виде массива, поэтому блокиприменяется к каждому h и генерирует из него новый хеш

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