Médio JavaScript

Removendo duplicatas e mantendo a ordem

Enunciado

Crie uma função unicosOrdenados(array) que remove elementos duplicados de um array e retorna um novo array com os elementos únicos na ordem em que apareceram pela primeira vez. Use Set para garantir unicidade.

Requisitos

  • A função deve retornar um array.
  • Elementos duplicados devem ser removidos.
  • A ordem de primeira aparição deve ser preservada.
  • O array original não deve ser modificado.

Código inicial

function unicosOrdenados(array) {
  // seu código aqui
}

console.log(unicosOrdenados([3, 1, 2, 3, 2, 4, 1]));

Saída esperada

[3, 1, 2, 4]
Ver dica

Converta o array para Set e depois use spread [...set] ou Array.from(set). O Set mantém a ordem de inserção.

Mostrar solução
function unicosOrdenados(array) {
  // Set remove duplicatas e preserva a ordem de inserção
  const conjunto = new Set(array);
  return [...conjunto];
}

console.log(unicosOrdenados([3, 1, 2, 3, 2, 4, 1]));

Passo a passo

  1. Criamos um Set a partir do array original: new Set(array). O construtor do Set itera sobre o array e adiciona cada elemento, ignorando duplicatas automaticamente.
  2. O Set resultante contém apenas valores únicos na ordem em que foram inseridos pela primeira vez.
  3. Usamos o operador spread ... para expandir o Set em um novo array.
  4. Retornamos esse novo array.

Por que funciona

O Set é uma coleção que só aceita valores únicos. Ao construí-lo a partir de um array, ele descarta as repetições. Como o Set mantém a ordem de inserção (assim como o Map), a ordem original é preservada. A conversão para array com spread é idiomática e concisa.

Erros comuns

  • Usar new Set(array).values() e não converter: Set não é um array; se você retornar o Set diretamente, o tipo será diferente do esperado.
  • Modificar o array original: se você fizer array.length = 0 ou array.splice, estará mutando a entrada. A solução não faz isso.
  • Esquecer que Set usa igualdade de valor (SameValueZero): para objetos, dois objetos diferentes com mesmo conteúdo não são considerados duplicatas. Se precisar comparar por conteúdo, terá que usar outra estratégia.

Outra forma de resolver

Usando filter com um Set auxiliar:

function unicosOrdenados(array) {
  const vistos = new Set();
  return array.filter(item => {
    if (vistos.has(item)) return false;
    vistos.add(item);
    return true;
  });
}

Essa abordagem é útil se você precisar de lógica adicional durante a filtragem.

Saída esperada

[3, 1, 2, 4]