Suggestion for improving code to get dynamic user form outputs

Hi, I need your suggestion to improve my code. I need to get user dynamic form outputs and convert it to map.

my user inputs:

%{
  "_csrf_token" => "CODE",
  "input-name-1" => "filed1",
  "input-name-2" => "field",
  "input-name-3" => "field2",
  "input-value-1" => "value1",
  "input-value-2" => "",
  "input-value-3" => "value2",
  "setting" => %{"section" => "public"}
}

then I convert this to a map with this way:

    user_fields = Map.to_list(full_params)
    |> Enum.filter(fn {key, _value} -> String.slice(key, 0..5) == "input-" end)

    Enum.map(user_fields, fn {key, field_name} ->
      if String.slice(key, 0..10) == "input-name-" do
        ["input", "name", number] = String.split(key, "-")
        {_value_key, value_value} = Enum.find(user_fields, fn {user_key, _user_value} -> user_key == "input-value-#{number}" end)
        {field_name, value_value}
      end
    end)
    |> Enum.reject(&is_nil/1)
    |> Enum.reject(fn {key, value} -> key == "" or value == "" end)
    |> Map.new
    |> IO.inspect()

and final out puts are like this:

%{"field2" => "value2", "filed1" => "value1"}

Is there a shorter way?

By the way, I couldn’t create a pattern which uses <> binary instead of String.slice.

Thanks

I’d do it this way

full_params
|> Enum.flat_map(fn
  {"input-name-" <> number, key} when is_binary(key) and key != "" ->
    case full_params["input-value-#{number}"] do
      value when is_binary(value) and value != "" -> [{key, value}]
      _ -> []
    end

  _ ->
    []
end)
|> Map.new()
1 Like