замена нулевых значений в карте на какое-либо другое значение - PullRequest
1 голос
/ 24 июня 2019

У меня есть карта

exchange_accounts = %{"BSE" => "yes", "MCX" => "", "NSE" => ""}

Мне нужно проверить только пустые значения на данной карте. если я найду какой-либо ключ с пустым значением / null, его следует заменить другим Должны быть изменены только нулевые значения, остальные значения должны быть такими же

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

предположим client_id = "ASHA14"

for {k, v} <- exchange_accounts, v == "",
  do: Map.replace!(exchange_accounts, k, client_id)

результатом должна быть карта

%{"BSE" => "yes", "MCX" => "ASHA14", "NSE" => "ASHA14"}

но каждый раз повторяется цикл и формируется новая карта

[%{"BSE" => "ASHA14", "MCX" => "", "NSE" => ""}
 %{"BSE" => "", "MCX" => "ASHA14", "NSE" => ""}
 %{"BSE" => "", "MCX" => "", "NSE" => "ASHA14"}]

Ответы [ 2 ]

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

Вы были почти там; в то время как Enum.reduce/3 наверняка работает, более краткое решение с пониманием Kernel.SpecialForms.for/1 (использующее параметр ключевого слова into: для создания карты) будет:

for {k, v} <- %{"BSE" => "yes", "MCX" => "", "NSE" => ""},
  do: {k, (if is_nil(v) or v == "", do: "SUBST", else: v)},
  into: %{}
#⇒ %{"BSE" => "yes", "MCX" => "SUBST", "NSE" => "SUBST"}

Дело в том, что for/1 просто пропускает записи, не проходя ни одно из условий, в то время как вам нужно сохранить их в целости.

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

так что вы выполняете цикл по exchange_accounts с фильтром v == "". Это создаст новый список со значением от Map.replace!(exchange_accounts, k, client_id)

iex()> for {k, v} <- exchange_accounts, v == "", do: Map.replace!(exchange_accounts, k, client_id)
[
  %{"BSE" => "yes", "MCX" => "ASHA14", "NSE" => ""},
  %{"BSE" => "yes", "MCX" => "", "NSE" => "ASHA14"}
]

То, что я думаю, должно быть:

 Enum.reduce(exchange_accounts, %{}, fn {k, v}, acc ->
   if v == "" || v == nil, do: Map.put(acc, k, client_id),
   else: Map.put(acc, k, v)
 end)


iex()>
%{"BSE" => "yes", "MCX" => "ASHA14", "NSE" => "ASHA14"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...