Elixir 的 集合操作问题

Elixir小白一个。话不多说,直入主题。
对于下面的page中的entries,如何优雅的插入:obj_c => "obj_c"而不适用中间变量呢。

page = %{
    :page_size => "1",
    :page_total=> "10",
    :entries => [
        %{
            :obj_a => "obj_a",
            :obj_b => "obj_b"
            # 这里要插入:obj_c => "obj_c"
        },
        %{
            :obj_a => "obj_a",
            :obj_b => "obj_b",
            # 这里要插入:obj_c => "obj_c"
        }
    ]
}

使用中间变量的方法

entry_new = Enum.map(
    page.entries,
    fn x -> Map.put(x, :obj_c, "obj_c") end
)
page = Map.put(page, :entries, entry_new)

不适用中间变量的方法

# 尝试一 不报错。但是page没有改变。这是为什么呢
page.entries 
|> Enum.map(fn x -> Map.put(x, :obj_c, "obj_c" end)
# 尝试二 直接报错。page.entries 这里会被认为是函数,好奇怪。
page.entries = page.entries 
|> Enum.map(fn x -> Map.put(x, :obj_c, "obj_c" end)
阅读 1.5k
1 个回答

你好, 你这个使用中间变量的方法也是不能编译的吧...

使用中间变量应该这么写:

  def test() do
    page = %{
      :page_size => "1",
      :page_total => "10",
      :entries => [
        %{
          :obj_a => "obj_a",
          :obj_b => "obj_b"
          # 这里要插入:obj_c => "obj_c"
        },
        %{
          :obj_a => "obj_a",
          :obj_b => "obj_b"
          # 这里要插入:obj_c => "obj_c"
        }
      ]
    }

    page |> Map.get(:entries) |> IO.inspect()

    entry_new =
      page
      |> Map.get(:entries)
      |> Enum.map(fn x -> Map.put(x, :obj_c, "obj_c") end)

    page = Map.put(page, :entries, entry_new)

    page |> IO.inspect()
  end

不使用中间变量的方法:

  def test() do
    page = %{
      :page_size => "1",
      :page_total => "10",
      :entries => [
        %{
          :obj_a => "obj_a",
          :obj_b => "obj_b"
          # 这里要插入:obj_c => "obj_c"
        },
        %{
          :obj_a => "obj_a",
          :obj_b => "obj_b"
          # 这里要插入:obj_c => "obj_c"
        }
      ]
    }

    page |> Map.get(:entries) |> IO.inspect()

    page =
      page
      |> Map.put(
        :entries,
        page
        |> Map.get(:entries)
        |> Enum.map(fn x -> Map.put(x, :obj_c, "obj_c") end)
      )

    page |> IO.inspect()
  end
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进