首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将地图中的空值替换为其他值

将地图中的空值替换为其他值
EN

Stack Overflow用户
提问于 2019-06-24 14:33:00
回答 2查看 66关注 0票数 1

我有一张地图

代码语言:javascript
复制
exchange_accounts = %{"BSE" => "yes", "MCX" => "", "NSE" => ""}

我只需要检查这个给定映射中的空值。如果我发现任何键的值为空值/null,它应该被替换为其他值。仅应更改空值,其他值应相同

这就是我已经尝试过的,我尝试使用for循环来实现,但是每次它都需要一个新的map,并且我还需要将所有替换的值存储在新map中,因为我需要将它插入到数据库中。

假设client_id = "ASHA14"

代码语言:javascript
复制
for {k, v} <- exchange_accounts, v == "",
  do: Map.replace!(exchange_accounts, k, client_id)

结果应该是一张地图

代码语言:javascript
复制
%{"BSE" => "yes", "MCX" => "ASHA14", "NSE" => "ASHA14"}

但是每次它迭代循环并形成一个新的映射

代码语言:javascript
复制
[%{"BSE" => "ASHA14", "MCX" => "", "NSE" => ""}
 %{"BSE" => "", "MCX" => "ASHA14", "NSE" => ""}
 %{"BSE" => "", "MCX" => "", "NSE" => "ASHA14"}]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-24 16:50:59

所以你要做的就是用一个过滤器v == ""遍历exchange_accounts。它将创建一个具有来自Map.replace!(exchange_accounts, k, client_id)的值的新列表

代码语言:javascript
复制
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"}
]

我认为它应该是:

代码语言:javascript
复制
 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"}
票数 1
EN

Stack Overflow用户

发布于 2019-06-24 17:14:44

您马上就到了;虽然Enum.reduce/3肯定可以工作,但使用Kernel.SpecialForms.for/1理解(使用into:关键字参数来生成映射)的更简洁的解决方案是:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56730971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档