← JavaScript: linguagem e diagnóstico de aplicações
04 / 10 · 50 MIN

Arrays, coleções e iteração

Escolhe regras de iteração, identidade e ordenação que preservem dados, posições e resultados em coleções.

Comprimento não é presença

New Array(3) cria um array com comprimento três e posições vazias. Num ambiente sem propriedades numéricas herdadas, map não chama o callback para essas posições. Um array [undefined, undefined, undefined] é diferente: tem três elementos presentes, embora os valores sejam undefined.

Map fornece valor, índice e array ao callback. Passar parseInt diretamente faz com que o índice seja interpretado como radix: a intenção de converter cada texto decimal não é suficiente para definir uma chamada correta. Usa uma função com argumentos explícitos, como value => parseInt(value, 10), quando a leitura de prefixos for realmente o contrato; para validar texto completo, aplica primeiro as regras da fronteira.

Valores iterados e objetos partilhados

O ciclo for...of consome valores de um iterador. Com o iterador normal de Array, uma propriedade adicional note não se torna um elemento da sequência. Não confundas essa iteração com a enumeração de nomes de propriedades. Nas análises desta aula, os arrays não são alterados durante a iteração.

Fill recebe um valor e coloca-o nos índices selecionados. Se esse valor for um objeto, todas essas posições recebem a mesma referência. Array.from({ length: 2 }, () => ({ count: 0 })) chama uma função que cria um objeto por posição. Copiar depois o array criado por fill não separa os contadores já partilhados.

Ordenação e efeito sobre a entrada

Sort altera o array recebido e devolve esse mesmo array. Sem comparador, os números são comparados pelas suas representações textuais: [4, 21, 3] fica [21, 3, 4]. Para inteiros pequenos e validados, (a, b) => a - b estabelece ordem numérica crescente. Um comparador que devolve apenas a > b não exprime corretamente os três resultados negativo, zero e positivo.

ToSorted produz um array novo. Também podes copiar primeiro um array denso de números e aplicar sort à cópia. Nenhuma destas operações duplica recursivamente objetos que sejam elementos. A ordenação estável conserva a ordem recebida quando o comparador considera dois elementos equivalentes; não inventa um segundo critério por ID.

Acumuladores e coleções vazias

Reduce sem valor inicial procura um primeiro elemento para servir de acumulador. Num array vazio não o encontra e lança TypeError. Para somar scores, um 0 explícito define o resultado vazio e permite usar o mesmo contrato para qualquer quantidade de registos. Escolhe o valor inicial de acordo com a operação, não apenas para silenciar a exceção.

Mantém os limites numéricos declarados: no exemplo, até 1000 scores inteiros entre 0 e 100 produzem um total máximo de 100000, dentro do intervalo seguro de Number. Esse argumento não autoriza usar a mesma soma sem limites para dinheiro ou inteiros arbitrariamente grandes. Também não confundas ausência de registos com erro de leitura dos registos.

Identidade em Map, Set e procura

Map distingue a chave Number 9 da chave string "9". O contrato de importação deve decidir o tipo antes de inserir ou procurar. Se "09" e "9" forem identidades diferentes, converter ambas para Number destrói informação. Atualizar uma chave já presente com set altera o valor sem mover a entrada para o fim.

Set compara objetos pela identidade, não pelos campos. Dois objetos { id: "K" } criados separadamente continuam a ser dois membros. As regras de igualdade também variam entre métodos: includes encontra NaN por usar SameValueZero; indexOf usa igualdade estrita e não o encontra. Seleciona a regra que corresponde ao significado dos dados em vez de presumir uma comparação estrutural universal.

Exemplo: relatório estável e independente

BuildReport começa por projetar cada registo validado num objeto novo com id e score. A ordenação seguinte só altera o array snapshot. O comparador usa score; nos empates, a estabilidade conserva a posição relativa recebida. Para a entrada apresentada, a ordem é C, B, A e o total é 9.

A escrita posterior input[0].score = 99 não altera report.rows nem report.total. Se usássemos apenas input.toSorted, o array exterior seria novo, mas B continuaria a referir o objeto editado e poderia deixar de corresponder ao total guardado. A projeção é adequada ao esquema de dois campos primitivos; não é uma solução genérica para qualquer grafo de objetos.

Decisões e critérios de aceitação

Revê uma transformação por etapas: confirma o formato e o intervalo dos dados, a identidade das chaves, os argumentos de cada callback e as referências que ficam partilhadas. Depois determina quais objetos são alterados. Só no fim compara a ordem e os totais com os requisitos.

Inclui pelo menos um array vazio, um empate e dois objetos com campos iguais mas identidades distintas na análise. Quando o requisito pede uma fotografia histórica, acrescenta uma alteração posterior aos objetos de origem. Estas situações distinguem uma transformação que parece correta para uma lista simples de uma que conserva o contrato completo. As avaliações pedem escolhas justificadas por este raciocínio, sem execução de código.

function buildReport(rows) {
  const snapshot = rows.map(({ id, score }) => ({ id, score }));
  snapshot.sort((a, b) => a.score - b.score);
  const total = snapshot.reduce((sum, row) => sum + row.score, 0);
  return { rows: snapshot, total };
}
const input = [{ id: "B", score: 4 }, { id: "A", score: 4 }, { id: "C", score: 1 }];
const report = buildReport(input);
input[0].score = 99;
NA PRÁTICA

Assume um array denso de até 1000 registos comuns, com id string e score inteiro entre 0 e 100. Prevê a ordem e o total do relatório, incluindo empates e array vazio. A alteração final de input não deve reescrever o relatório.

Armadilhas comuns

Usar map para preencher posições vazias; ordenar números sem comparador; fornecer parseInt diretamente a map; assumir que Set compara campos; copiar apenas o array exterior.

Tópicos relacionados: Valores, conversões e contratos numéricos · Objetos, identidade e limites das propriedades · Estado, ordem e diagnóstico de integração

Leva esta ideia contigo

Declara a regra de identidade, a ordem e os efeitos permitidos. O método escolhido deve respeitar as três condições, incluindo entradas vazias e empates.

Criar conta

Referência: Array.prototype.map · ECMAScript 2026 (17th edition); browser APIs identified separately