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 osort(), mas devolve um array novo.toReversed(): como oreverse(), idem.toSpliced(): como osplice(), 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 desapareceuCom 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] — intacta2. 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á.