2016-09-12 4 views
1

У меня есть структура (данные), где реальные значения зависят от клиента, делает запрос, но я не могу их переназначить. Это мой код:Перевести значение в список Elixir

Базовая структура:

Party: [ 
    Sender: [ 

    ] 
] 

И пример о реальных значениях клиента:

Party: [ 
    Sender: [ 
    AgentUserSender: [ 
     Name: "The_name", 
     Type: "The_type", 
     OtherIDs: [ 
     {:OtherID, %{Description: "value"}, "_value"}, 
     {:OtherID, %{Description: "value_1"}, "_value_1"} 
     ], 
     OtherKey: "other_value" 
    ] 
    ] 
] 

И как я (плохо) пытаюсь сделать:

data[:Party][:Sender] = customer[:Party][:Sender] 

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

Party: [ 
    Sender: [ 
    TravelAgencySender: [ 
     Name: "NAME", 
     IATA_Number: "xxxxxxxx", 
     AgencyID: "agency" 
    ] 
    ] 

Большое спасибо.

+0

Что случилось только с помощью 'customer' как' data' ? Зачем вам нужно обновлять пустой объект? – mudasobwa

ответ

1

Я считаю, что вы хотите сделать это:

> data = [Party: [Sender: []]] 
[Party: [Sender: []]] 
> data = put_in(data[:Party][:Sender], ["something"]) 
[Party: [Sender: ["something"]]] 

или это:

> data = [Party: [Sender: ["something"]]] 
[Party: [Sender: ["something"]]] 
> data = put_in(data[:Party][:Sender], data[:Party][:Sender] ++ ["something_else"]) 
[Party: [Sender: ["something", "something_else"]]] 

#Alternatively update_in instead of put_in 
> data = [Party: [Sender: ["something"]]] 
[Party: [Sender: ["something"]]] 
> data = update_in(data[:Party][:Sender], &(&1 ++ ["something_else"])) 
[Party: [Sender: ["something", "something_else"]]] 
0

Самым простым способом будет использовать Keyword.get_and_update/3:

iex(1)> mine = [Party: [ Sender: [ ]]] 
iex(2)> cust = [Party: [ Sender: [ .......... ]]] 

iex(3)> { _, data } = mine |> Keyword.get_and_update(:Party, fn party -> 
...(3)> { _, result } = mine[:Party] 
...(3)>  |> Keyword.get_and_update(:Sender, fn sender -> 
...(3)>   { sender, cust[:Party][:Sender] } 
...(3)>  end) 
...(3)> { party, result } 
...(3)> end) 

iex(4)> data 
    [Party: [Sender: [AgentUserSender: [Name: "The_name", Type: "The_type", 
    OtherIDs: [{:OtherID, %{Description: "value"}, "_value"}, 
       {:OtherID, %{Description: "value_1"}, "_value_1"}], 
    OtherKey: "other_value"]]]] 

Если вы хотите объединить значения или изменить их каким-то сложным способом, просто измените

{ sender, cust[:Party][:Sender] } 

линия вернуть то, что необходимо в качестве второго элемента кортежа (первое должно быть значение есть, и, следовательно, должна быть оставлена ​​без изменений.)

Смежные вопросы