Como já disseram, o problema é que dentro da função vc está recriando o array novamente. Então o certo é criar o array fora e passá-lo como argumento da função.
Mas tem outros detalhes para se pensar. Por exemplo, map
sempre retorna um novo array, então só seria interessante criar outro array se vc precisasse preservar o original. Vc precisa manter o array original, ou só precisa do resultado final, com os números setados com active: true
?
Se não precisa preservar o array original, é desnecessário usar map
e ficar criando um novo array a cada número setado. Neste caso, a função poderia simplesmente alterar o array:
function sorteiaNumero(numberArray: {value: number, active: boolean}[], activeNumber: number) {
for (const item of numberArray) {
if (item.value === activeNumber) {
item.active = true;
break;
}
}
}
// outra forma de criar o array
let numberArray = [];
for (let i = 1; i <= 60; i++) {
numberArray.push({ value: i, active: false });
}
sorteiaNumero(numberArray, 10);
sorteiaNumero(numberArray, 14);
console.log(numberArray); // 10 e 14 setados
Vi no GitHub que vc está criando um array com os números de 1 a 60 (que é diferente do exemplo que vc colocou acima, que coloca de 0 a 59). Enfim, sugeri acima uma outra forma de criá-lo, usando um for
simples.
E como os números do array não se repetem, só preciso seguir no loop até encontrar o número. Depois, posso interromper o for
usando um break
(se os números se repetissem, aí teria que tirar o break
).
Também mudei o nome do parâmetro: em vez de numbers
, usei activeNumber
. Pode parecer um detalhe besta, mas dar nomes melhores ajuda na hora de programar. O nome numbers
está no plural, e passa a ideia - neste caso, errada - de são vários números. Mas pelo que entendi, é um só, então mudei para um nome no singular e que tenha mais a ver com o que ele representa.
Um detalhe: neste caso específico vc sabe que o array tem números de 1 a 60 em ordem. Ou seja, o número 1 está na posição 0, o número 2 está na posição 1 e assim por diante. Então a função poderia ser apenas:
function sorteiaNumero(numberArray: {value: number, active: boolean}[], activeNumber: number) {
numberArray[activeNumber - 1].active = true;
}
Mas como eu já disse, é apenas para este caso específico, e só se vc garantir que sempre vai chamar a função passando um número entre 1 e 60. Para os casos mais genéricos, um loop é o mais indicado.
Complementando, dei uma olhada rápida pelo código do GitHub, e talvez essa complicação toda seja desnecessária. Nem tudo precisa de async
/await
. Por exemplo, sua função generateUniqueNumbers
, não faz o menor sentido ela retornar uma Promise
, já que não faz nenhuma operação assíncrona que necessita de espera. Bastaria que ela retornasse o array diretamente:
function generateUniqueNumbers(): Number[] {
const numeros: Number[] = [];
for (let i = 1; i <= 60; i++) {
numeros.push(i);
}
// Embaralha os números
for (let i = numeros.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[numeros[i], numeros[j]] = [numeros[j], numeros[i]];
}
// Retorna os primeiros 5 números do array
// não precisa de variáveis intermediárias, pode retornar direto
return numeros.slice(0, 6).sort((a: number, b: number) => a - b);
}
Vi que na função FN_GET_NUMBER_GAME()
vc transforma o array em string, só para passá-lo para insertValueTableGame
. Mas depois vc transforma esta string novamente em array, usando split
. Esse trabalho todo é desnecessário.
O que eu faria: remova essa função FN_GET_NUMBER_GAME()
, e use diretamente a que gera os números. E vc converte para string somente na hora de salvar:
const NEW_NAMBER_GAME = generateUniqueNumbers(); // nada de async/await, é desnecessário
...
const GAMER = await insertValueTableGame(NEW_NAMBER_GAME.toString(), LAST_NAMBER_INSERTED_TABLE_GAME);
E claro, arrume esses nomes. NAMBER está errado (é "U" em vez de "A"), mas acho que o nome atual também não é bom, pois não passa a ideia de que é o array de números. Poderia ser UNIQUE_NUMBERS
ou algo assim. Na verdade, não sei porque adotou esse padrão de tudo em maiúsculas, mas enfim. Agora que esta variável contém o array, pode usá-la no restante do programa, no lugar de TRANSFORME_STRING_TO_ARRAY
(outro péssimo nome, aliás).
Enfim, não parei pra ver todo o código, mas não entendi porque sorteiaNumeros
precisa retornar outra função. Parece que tem várias complicações desnecessárias aí.