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)
阅读 339
评论
    1 个回答
    • 632

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

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

      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
      撰写回答

      登录后参与交流、获取后续更新提醒