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
- Criamos um
Seta partir do array original:new Set(array). O construtor doSetitera sobre o array e adiciona cada elemento, ignorando duplicatas automaticamente. - O
Setresultante contém apenas valores únicos na ordem em que foram inseridos pela primeira vez. - Usamos o operador spread
...para expandir oSetem um novo array. - 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:Setnão é um array; se você retornar oSetdiretamente, o tipo será diferente do esperado. - Modificar o array original: se você fizer
array.length = 0ouarray.splice, estará mutando a entrada. A solução não faz isso. - Esquecer que
Setusa 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]