как перебирать и изменять пару ключ-значение внутри карты в Elixir. Пример кода ниже. Мне нужно удалить c: отовсюду - PullRequest
0 голосов
/ 10 июля 2020

** ниже - это образец карты, который имеет c: в начале некоторых ключей, и мне нужна такая же карта, у которой нет нигде в ключах **

map = %{
  "soap:Body" => {"c:replyMessage",
   %{
     "c:ccCaptureReply" => %{
       "c:amount" => "100.00",
       "c:reasonCode" => "100",
       "c:reconciliationID" => "2",
       "c:requestDateTime" => "2019-07-10T16:57:49Z"
     },
     "c:decision" => "ACCEPT",
     "c:merchantReferenceCode" => "1255",
     "c:purchaseTotals" => {"c:currency", "US"},
     "c:reasonCode" => "100",
     "c:requestID" => "2",
     "c:requestToken" => "FkKZy21",
     "xmlns:c" => "urn:schemas-cybersource-com:transaction-data-1.165"
   }},
  "soap:Header" => {"wsse:Security",
   %{
     "wsu:Timestamp" => %{
       "wsu:Created" => "2019-07-10T16:57:49.246Z",
       "wsu:Id" => "Timestamp-90787002",
       "xmlns:wsu" => "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
     },
     "xmlns:wsse" => "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
   }},
  "xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/"
} 

1 Ответ

1 голос
/ 10 июля 2020

Даже если глубокий обход поддерживался ядром , у вас есть кортежи, поскольку значения и кортежи не повторяются.

Единственный способ - написать рекурсивное решение на основе шаблона -matching.

defmodule Sanitizer do
  def yo(%{} = map) do
    map
    |> Enum.map(fn
      {<<"c:", rest::binary>>, v} -> {rest, yo(v)}
      {k, v} -> {k, yo(v)}
    end)
    |> Map.new()
  end
  def yo({<<"c:", rest::binary>>, v}), do: {rest, yo(v)}
  def yo({k, v}), do: {k, yo(v)}
  def yo(any), do: any
end

Sanitizer.yo(map)
#⇒ sanitized result

FWIW, есть библиотека Iteraptor, написанная мной в те времена, когда я думал, что наличие leftpad -подобных библиотек для всего достаточно хорошо. Он мог бы иметь дело с вводом, если бы у него не было кортежей (которые просто невозможно обойти никакими средствами.)

...