FNSP Web Page

Ordenar sem estragar o original

Durante vinte e cinco anos, o sort() e o reverse() alteraram o array em que eram chamados. É a origem de uma classe inteira de bugs: uma função recebe uma lista, ordena-a para mostrar, e devolve-a alterada a quem a emprestou.

O ECMAScript 2023 acrescentou quatro métodos que fazem o mesmo sem tocar no original:

  • toSorted(): como o sort(), mas devolve um array novo.

  • toReversed(): como o reverse(), idem.

  • toSpliced(): como o splice(), idem.

  • with(): troca o elemento de um índice, devolvendo uma cópia.

1. O bug clássico

const notas = [14, 9, 18, 11];

function melhorNota(lista) {
  return lista.sort((a, b) => b - a)[0]; // ordena a lista de quem chamou!
}

console.log(melhorNota(notas)); // 18
console.log(notas); // [18, 14, 11, 9] — a ordem original desapareceu

Com o método novo, a lista de quem chamou fica como estava:

function melhorNotaSemEstragar(lista) {
  return lista.toSorted((a, b) => b - a)[0];
}

console.log(melhorNotaSemEstragar(notas)); // 18
console.log(notas); // [14, 9, 18, 11] — intacta

2. Trocar um elemento sem copiar o array à mão

const dias = ['segunda', 'terca', 'quarta'];

const corrigido = dias.with(1, 'terça');

console.log(corrigido); // [ 'segunda', 'terça', 'quarta' ]
console.log(dias[1]); // 'terca'

3. E o último elemento, já agora

Da mesma leva vieram o at(), que aceita índices negativos, e o findLast(), que procura do fim para o princípio:

const historico = [
  { acao: 'criou', ok: true },
  { acao: 'editou', ok: false },
  { acao: 'publicou', ok: true },
];

console.log(historico.at(-1).acao); // 'publicou'

// A última entrada que correu bem, sem inverter o array primeiro
console.log(historico.findLast((entrada) => entrada.ok).acao); // 'publicou'

A regra que fica é simples: se o nome começa por to, devolve uma cópia. Se não começa, altera o que lá está.

Comentários

Ainda ninguém comentou este artigo.

Voltar ao blog

Gostávamos de saber quantas pessoas visitam o site, com o Google Analytics. Sem a sua autorização não corre nada. Política de Privacidade.