Elixir:更新 map 列表中的特定值

标签 elixir

给定以下 map 列表:

ball_prop_list = 
[
  %{"id" => "cue", "is_idle" => true, "velocity_x" => 0.0, "velocity_z" => 0.0, "x" => -15.0, "z" => 0.0},
  %{"id" => "ball_1", "is_idle" => true, "velocity_x" => 0.0, "velocity_z" => 0.0, "x" => 15.0, "z" => 0.0},
  %{"id" => "ball_2", "is_idle" => true, "velocity_x" => 0.0, "velocity_z" => 0.0, "x" => 17.0, "z" => 1.1},
  %{"id" => "ball_3", "is_idle" => true, "velocity_x" => 0.0, "velocity_z" => 0.0, "x" => 17.0, "z" => -1.1}
]

我如何着手改变,比如说,只是 "id"=> "cue"velocity_xvelocity_y,并保持其他都一样吗?

我只是尝试创建一个具有更新值的新列表(这不一定是我的目标),例如:

new_prop_list = Enum.map(balls_json_list, fn(val) -> 
  if val["id"] == "cue" do
    Map.put(val, "velocity_x" velocity_vector[:x])
    Map.put(val, "velocity_z" velocity_vector[:z])
  end
end)

但这并没有奏效,可能是因为我的 map 没有使用原子键——我目前看到的所有其他示例都使用原子键,或者添加新的键和值,等等。

还有什么我可以尝试的吗?

最佳答案

被极度低估Access这是更强大的方式,尤其是在深度更新方面。

尽管在这种特殊情况下,直截了当的 Map.put/3 可能看起来更简单,但我还是会用 update_in/3 发布解决方案使用 Access。请注意,与 Map.put 不同,它可能用于修改任何 级别的深层嵌套结构。

update_in(
  ball_prop_list,
  [Access.filter(&match?(%{"id" => "cue"}, &1))],
  &Map.merge(&1, %{"velocity_x" => :new_velocity})
)

关于Elixir:更新 map 列表中的特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66750240/

相关文章:

Elixir 别名返回 "invalid argument for alias, expected a compile time atom or alias, got: "

coding-style - Elixir 是否有编码标准或由语言开发人员发布的权威风格指南,如 PEP8 或 Erlang 编程规则?

elixir - 埃克托+ Elixir : How do I query a hashmap field?

erlang - 如何键入单个字母 ASCII 字符串(值 0-127)?

serial-port - Elixir 串口连接

elixir - 使用Elixir HTTPoison库创建Github token

elixir - 如何在 Elixir 中按 map 值对 map 列表进行排序?

elixir - 无法在 MacBook Pro 上连接 Elixir 节点

elixir - Phoenix : foreign key not being inserted

elixir - Phoenix/Elixir/Ecto - unique_constraint 不适用于名称选项