RubyOnRails + Попытка преобразовать JSON в определенный формат

Существующие данные:

[
 {"name"=> "login[0][id]", "value"=> "10"},
 {"name"=> "login[0][name]", "value"=> "AAA"}, 
 {"name"=> "login[0][login]", "value"=> "login-1"}, 
 {"name"=> "login[0][password]", "value"=> "password-1"},
 {"name"=> "login[0][notes]", "value"=> "url-1"}, 
 {"name"=> "login[1][id]", "value"=> "15"}, 
 {"name"=> "login[1][name]", "value"=> "BBB"}, 
 {"name"=> "login[1][login]", "value"=> "admin"}, 
 {"name"=> "login[1][password]", "value"=> "admin-pwd"},
 {"name"=> "login[1][notes]", "value"=> "url-2"}
]

Ожидал:

[
    "0" => {
        "id": "10",
        "name": "AAA", 
        "login", "login-1",
        "password": "password-1",
        "notes": "url-1"
    }, 
    "1" => {
        "id": "15",
        "name": "BBB", 
        "login", "ladmin",
        "password": "admin-pwd",
        "notes": "url-2"
    }
]
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из подходов к преобразованию объекта в желаемый формат — использовать регулярное выражение для извлечения регистрационного номера и связанных с ним атрибутов, например:

def convert(array)
  name_regex = /^login\[(?<number>\d+)\]\[(?<attribute>\S+)\]/
  result = {}

  array.each do |obj|
    match = obj["name"].match(name_regex)
    next if match.nil?

    result[match[:number]] ||= {}
    result[match[:number]][match[:attribute]] = obj["value"]
  end
  
  result
end

Затем, учитывая исходный массив в вашем примере, этот метод должен вернуть следующее:

array = [
  { "name" => "login[0][id]", "value" => "10" },
  { "name" => "login[0][name]", "value" => "AAA" }, 
  { "name" => "login[0][login]", "value" => "login-1" }, 
  { "name" => "login[0][password]", "value" => "password-1" },
  { "name" => "login[0][notes]", "value" => "url-1" }, 
  { "name" => "login[1][id]", "value" => "15" }, 
  { "name" => "login[1][name]", "value" => "BBB" }, 
  { "name" => "login[1][login]", "value" => "admin" }, 
  { "name" => "login[1][password]", "value" => "admin-pwd" },
  { "name" => "login[1][notes]", "value" => "url-2" }
]

convert(array)

#=> {"0"=>{"id"=>"10", "name"=>"AAA", "login"=>"login-1", "password"=>"password-1", "notes"=>"url-1"}, "1"=>{"id"=>"15", "name"=>"BBB", "login"=>"admin", "password"=>"admin-pwd", "notes"=>"url-2"}}

Другие вопросы по теме