从元组Elixir列表中选择值

equ*_*nt8 6 elixir

我正在尝试从元组列表中提取值:

s3_headers = %{headers: [{"x-amz-id-2","yQKurzVIApkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFBINsPxe+7Vc="},
  {"x-amz-request-id", "82xxxxxxxxx23"},
  {"Date", "Thu, 25 May 2017 22:03:09 GMT"},
  {"Last-Modified", "Thu, 25 May 2017 21:42:28 GMT"},
  {"ETag", "\"6f04733333333333333368997\""},
  {"x-amz-meta-original_name", "Screenshot from 2016-11-27 17-32-03.png"},
  {"Accept-Ranges", "bytes"}, {"Content-Type", ""},
  {"Content-Length", "612391"}, {"Server", "AmazonS3"}], status_code: 200}
Run Code Online (Sandbox Code Playgroud)

我到目前为止如何设法做到这一点的方式是这样的:

{"x-amz-meta-original_name", original_name } = s3_headers |> List.keyfind("x-amz-meta-original_name", 0)
{"Content-Length", content_length }          = s3_headers |> List.keyfind("Content-Length", 0)
{"Content-Type", content_length }            = s3_headers |> List.keyfind("Content-Type", 0)
Run Code Online (Sandbox Code Playgroud)

感觉过度复杂可以推荐更好的方法吗?

Ste*_*len 14

我通常使用字符串键将元组列表转换为Map.然后使用字符串键访问.这需要花费更多的时间,但每次访问的时间要比Enum.find少得多

iex(19)> headers = Enum.into s3_headers[:headers], %{}
%{"Accept-Ranges" => "bytes", "Content-Length" => "612391",
  "Content-Type" => "", "Date" => "Thu, 25 May 2017 22:03:09 GMT",
  "ETag" => "\"6f04733333333333333368997\"",
  "Last-Modified" => "Thu, 25 May 2017 21:42:28 GMT", "Server" => "AmazonS3",
  "x-amz-id-2" => "yQKurzVIApkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFBINsPxe+7Vc=",
  "x-amz-meta-original_name" => "Screenshot from 2016-11-27 17-32-03.png",
  "x-amz-request-id" => "82xxxxxxxxx23"}
iex(20)> original_name = headers["x-amz-meta-original_name"]
"Screenshot from 2016-11-27 17-32-03.png"
iex(21)> content_length = headers["Content-Length"]
"612391"
Run Code Online (Sandbox Code Playgroud)

  • 像魅力一样工作,谢谢。如果有人感兴趣,我已经将讨论总结到 TIL 博客 http://www.eq8.eu/tils/29-selecting-value-from-list-of-tuples-elixir (2认同)
  • 请记住,元组列表和映射具有不同的特征.元组列表可以包含重复的"键",而映射则不能.使用这种方法可能会丢失信息. (2认同)