Desafio JavaScript
Ranking de pontuações
Enunciado
Crie uma função ranking(pontos) que receba um array de números, devolva um novo array ordenado do maior para o menor (sem alterar o original) e remova pontuações duplicadas. Use slice para copiar, sort com comparador numérico, splice para remover duplicatas e includes para checar se o valor já apareceu.
Requisitos
- Não modificar o array recebido (usar
slicepara copiar). - Ordenar em ordem decrescente com
sort((a, b) => b - a). - Remover duplicatas usando
spliceeincludes. - Retornar o novo array e imprimir o resultado para
[50, 20, 50, 30, 20, 10].
Código inicial
function ranking(pontos) {
// copie com slice, ordene e remova duplicatas
}
console.log(ranking([50, 20, 50, 30, 20, 10]));
Saída esperada
[ 50, 30, 20, 10 ]
Ver dica
Percorra o array ordenado de trás para frente; se o valor já apareceu antes (use includes num array auxiliar ou compare com o anterior), remova com splice(i, 1).
Mostrar solução
function ranking(pontos) {
// 1) copia rasa: o array original fica intacto
const ordenado = pontos.slice();
// 2) ordena do maior para o menor (comparador numérico)
ordenado.sort((a, b) => b - a);
// 3) remove duplicatas percorrendo de trás para frente
for (let i = ordenado.length - 1; i > 0; i--) {
if (ordenado[i] === ordenado[i - 1]) {
ordenado.splice(i, 1); // remove a posição i
}
}
return ordenado;
}
const original = [50, 20, 50, 30, 20, 10];
console.log(ranking(original));
console.log(original); // confirma que não foi alterado
Passo a passo
pontos.slice()cria uma cópia rasa do array recebido, garantindo que o original não seja modificado porsortesplice.ordenado.sort((a, b) => b - a)ordena em ordem decrescente; sem o comparador, osorttrataria os números como strings e[50, 20, 30, 10]sairia errado.- O
forcomeça no último índice e vai até1, comparando cada elemento com o anterior. - Quando dois vizinhos são iguais,
ordenado.splice(i, 1)remove o da posiçãoi. - Percorrer de trás para frente evita pular elementos: ao remover o índice
i, os índices menores continuam válidos. - No final,
return ordenadoentrega o novo array. - O
console.log(original)comprova que o array de entrada segue com os seis valores.
Por que funciona
Como a lista já está ordenada, valores duplicados ficam sempre lado a lado, então basta comparar cada item com o anterior. slice garante imutabilidade, sort com comparador garante ordem numérica correta e splice remove exatamente uma posição por vez.
Erros comuns
- Fazer
const ordenado = pontosem vez depontos.slice(): os dois nomes apontam para o mesmo array, esort/spliceacabam alterando o original. - Usar
ordenado.sort()sem comparador: o resultado vira ordem lexicográfica,[ 50, 30, 20, 10 ]ainda parece certo nesse caso, mas com[100, 9]sairia[ 100, 9 ]. - Percorrer de frente para trás com
splice: ao remover o índicei, o próximo elemento é pulado.
Outra forma de resolver
Usar Set para remover duplicatas: return [...new Set(pontos)].sort((a, b) => b - a);. É mais curto e idiomático quando não é obrigatório usar splice.
Saída esperada
[ 50, 30, 20, 10 ]
[ 50, 20, 50, 30, 20, 10 ]