Enum.dedup doesn't work

I have a map:

  items = [
    %{id: 13, value: "7"},
    %{id: 14, value: "8"},
    %{id: 10, value: "xl"},
    %{id: 13, value: "7"},
    %{id: 14, value: "8"},
    %{id: 10, value: "xl"},
    %{id: 13, value: "7"},
    %{id: 14, value: "8"},
    %{id: 10, value: "xl"}
  ]

I want to remove duplicates by “id”. This doesn’t work:

  Enum.dedup_by(items, &(&1.id))
  # =====>
  [       
    %{id: 13, value: "7"},
    %{id: 14, value: "8"},
    %{id: 10, value: "xl"},
    %{id: 13, value: "7"},
    %{id: 14, value: "8"},
    %{id: 10, value: "xl"},
    %{id: 13, value: "7"},
    %{id: 14, value: "8"},
    %{id: 10, value: "xl"}
  ]

Why not?

From documentation:

Enumerates the enumerable, returning a list where all consecutive duplicated
elements are collapsed to a single element.

The key here is consecutive duplicated elements. Perhaps sort the map first and then run dedup?

5 Likes

To add on @cmkarlsson answer, use Enum.uniq_by.

6 Likes