替换长生不老药中数组中的项目

dyl*_*jha 1 elixir

假设我有一张看起来像这样的地图

一个组织具有一组属性,而这些属性具有一组“ access_tokens”

organization = %{
  name: "Org",
  properties: [
    %{
      name: "prop1",
      access_tokens: [%{id: "at-1", name: "one-1"}, %{id: "at-2", name: "one-2"}]
    },
    %{
      name: "prop2",
      access_tokens: [%{id: "at-3", name: "two-1"}, %{id: "at-4", name: "two-2"}]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

现在,我有了此映射,对于一个特定的访问令牌,此映射的ID与2nd属性的访问令牌之一匹配:

access_token = %{id: "at-3", name: "new name"}
Run Code Online (Sandbox Code Playgroud)

迭代organization%{}使用新的访问令牌更新地图的最佳方法是什么?我要做的是找到基于进行匹配的访问令牌,id并将其替换为具有新名称的新令牌。

我有一些绕行的方式来做到这一点,但是在Elixir中这样做是一种干净的方式。

Ale*_*kin 6

你并不需要迭代,只使用AccessAccess.filter/1以及Access.all/0

put_in(
  organization,
  [:properties,
   Access.all(),
   :access_tokens,
   Access.filter(&match?(%{id: "at-3"}, &1)),
   :name],
  "new_name")
Run Code Online (Sandbox Code Playgroud)

我一直想知道,这门语言中最强大的功能之一是如何被大大低估了。

  • @dylanjha这里的match?(pattern,expr)是一个宏,它不喜欢尝试在您的new_at.id上进行匹配。您可以将其保存为变量并将其固定:`&match?(%{id:^ new_id},&1)`,或者可以使用更简单的函数进行过滤:`&&1 == new_at.id。 (2认同)