代码之家  ›  专栏  ›  技术社区  ›  dan-klasson

将具有整数的哈希转换为具有哈希的列表

  •  1
  • dan-klasson  · 技术社区  · 6 年前

    转换此哈希的最佳方法是:

    %{
        "0" => [
            %{"foo" => 1, "baz" => 10}
        ], 
        "1" => [
            %{"foo" => 2, "baz" => 11}
        ]
    }
    

    像这样的清单?

    [
        %{"foo" => 1, "baz" => 10},
        %{"foo" => 2, "baz" => 11}
    ]
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Aleksei Matiushkin    6 年前

    同时 Map.values/2 肯定会成功的 Kernel.SpecialForms/1 理解可能是一种更灵活的方式,因为它允许您在适当的地方过滤和/或修改结果。

    input = %{
      "0" => [
        %{"foo" => 1, "baz" => 10}
      ], 
      "1" => [
        %{"foo" => 2, "baz" => 11}
      ]
    }
    
    for {_, [map]} <- input, do: map
    #⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]
    

    如果你希望 更多 在值的每个列表中有一个以上的元素,请使用 Enum.reduce/3 :

    Enum.reduce(input, [], fn {_, maps}, acc -> acc ++ maps end)
    #⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]
    

    另一种可能是使用 Enum.flat_map/2 :

    Enum.flat_map(input, &elem(&1, 1))
    #⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]
    

    fwiw,解决方案 Map.values/1 (不推荐):

    input
    |> Map.values()
    |> Enum.flat_map(& &1)
    #⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]
    
        2
  •  0
  •   arpit    6 年前
    original = %{
        "0" => [
            %{"foo" => 1, "baz" => 10}
        ], 
        "1" => [
            %{"foo" => 2, "baz" => 11}
        ]
    }
    
    values_from_original = original |> Map.values
    
    result = for e <- values_from_original, do: e |> Enum.at(0)