как изменить список из одного формата в другой - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь изменить формат списка с помощью функции enum.

Оригинальный список выглядит так

myInitialList = 
[
 {1,
   [
     ["A3", "Teddy"],
     ["B3", "t@gmail.com"],
     ["C3", "56123456"],
     ["D3", "spain"]
   ]},
  {2,
   [
     ["A4", "Katrin"],
     ["B4", "m@yahoo.com"],
     ["C4", "85002145"],
     ["D4", "USA"]
   ]},
  {3,
   [
     ["A2", "name"],
     ["B2", "email"],
     ["C2", "phone"],
     ["D2", "country"]
   ]}
]

и я хотел бы отфильтровать приведенный выше список, чтобы получить следующий результат

myFinalList = 
[
    %{
        name: "Teddy", 
        email: "t@gmail.com", 
        phone: "56123456", 
        country: "spain"
    }, 
    %{
        name: "Katrin", 
        email: "m@yahoo.com", 
        phone: "85002145", 
        country: "USA"
    }
]

Кто-нибудь знает, как я могу построить функцию фильтра?

Это позволит мне легко вставить данные в мою базу данных. Я действительно ничего не пробовал, так как я полностью застрял с самого начала

в коде должно выглядеть как

myFinalList = myInitialList |> Enum.filter(.....)

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Вы ищете функцию Enum.map/2.Вы можете получить myFinalList с этим форматом, сделав это:

myFinalList =
  Enum.map(myInitialList, fn
    {_index, [[_, name], [_, email], [_, phone], [_, country]]} ->
      %{
        name: name,
        email: email,
        phone: phone,
        country: country
      }
  end)
0 голосов
/ 17 июня 2019

Во-первых, вам нужно разделить ваш ввод на имена и фактические значения:

[names | items] = myInitialList |> Enum.reverse()

items здесь в обратном порядке, но это нормально.

Теперь давайтеопределить маппер:

mapper =
  fn {_, lists} -> Enum.map(lists, fn [_, e] -> e end) end

И, наконец:

for values <- Enum.reverse(items),
  do: Enum.into(Enum.zip(mapper.(names), mapper.(values)), %{})
...