Modify Map result structure

I have a variable that has this result

%{
   "variables" => %{
     "0" => %{
       "column1" => "Example 1",
       "column2" => "Example 2",
       "column3" => "Example 3",
       "column4" => "Example 4",
       "column5" => "Example 5",
       "column6" => "Example 6",
       "column7" => "Example 7"
     },
     "1" => %{
       "column1" => "Example 10",
       "column2" => "Example 20",
       "column3" => "Example 30",
       "column4" => "Example 40",
       "column5" => "Example 50",
       "column6" => "Example 60",
       "column7" => "Example 70"
     }
   },
   "id" => "7",
   "name" => "Test 1"
}

How do I convert, and stay that way?

%{
   variables: [
     %{
       column1: "Example 1",
       column2: "Example 2",
       column3: "Example 3",
       column4: "Example 4",
       column5: "Example 5",
       column6: "Example 6",
       column7: "Example 7"
     },
     %{
       column1: "Example 10",
       column2: "Example 20",
       column3: "Example 30",
       column4: "Example 40",
       column5: "Example 50",
       column6: "Example 60",
       column7: "Example 70"
     }
   ],
   id: "7",
   name: "Test 1"
}

Is there any easier way to convert?

  data = %{
    "variables" => %{
      "0" => %{
        "column1" => "Example 1",
        "column2" => "Example 2",
        "column3" => "Example 3",
        "column4" => "Example 4",
        "column5" => "Example 5",
        "column6" => "Example 6",
        "column7" => "Example 7"
      },
      "1" => %{
        "column1" => "Example 10",
        "column2" => "Example 20",
        "column3" => "Example 30",
        "column4" => "Example 40",
        "column5" => "Example 50",
        "column6" => "Example 60",
        "column7" => "Example 70"
      }
    },
    "id" => "7",
    "name" => "Test 1"
  }

  Map.update!(data, "variables", fn variables ->
    Enum.map(variables, fn {_index, map} -> map end)
  end)

Ahh I did not see you also wanted the keys to be atoms.

This will do it:

variables =
  Enum.map(data["variables"], fn {_index, map} ->
    Enum.map(map, fn {key, val} -> {String.to_atom(key), val} end)
  end)
 
data 
|> Map.new(fn {key, val} -> {String.to_atom(key), val} end) 
|> Map.put(:variables, variables)

FWIW, that input shape is very similar to what Phoenix’s inputs_for helper creates - Ecto.Changeset may be what you’re looking for here.