Mais como seria, passar o array e como eu retornaria?
Primeira solução:
const numberArray = Array.from({ length: 60 }, (_, i) => ({ value: i, active: false }))
function retornaNumerosSorteados(array: number[], numbers: number) {
return array.map(item => ({
...item,
active: item.value == numbers
})
}
retornaNumerosSorteados(numberArray, 10)
retornaNumerosSorteados(numberArray, 14)
Segunda solução (funciona quase igual a classes):
function sorteiaNumeros() {
const numberArray = Array.from({ length: 60 }, (_, i) => ({ value: i, active: false }))
return (numbers: number) => numberArray.map(item => ({ ...item, active: item.value === numbers }))
}
const retornaNumerosSorteados = sorteiaNumeros()
retornaNumerosSorteados(10)
retornaNumerosSorteados(14)
O irmão muito obrigado por disponibilizar do seu tempo e sabedoria.
Que linda essa segunda forma, eu não conhecia esse conceito <3!
Grato!
Com respeito!
Você acha que estou colocando no local errado, porque ainda não faz o calculo!
https://github.com/heudersena/game-mega-sena/blob/development-02062023/src/cron/CronJobGamer.ts
Claro, é um erro muito simples que eu não meu atentei.
Ao utilizar a função map nós não mexemos na array original, apenas retornamos uma nova com os novos valores. A abordagem correta é a seguinte:
function sorteiaNumeros() {
const numberArray = Array.from({ length: 60 }, (_, i) => ({ value: i + 1, active: false }))
return (numbers: number) => {
numberArray.forEach(item => {
item.active = item.active || item.value === numbers
})
return numberArray
}
}
Basicamente com o forEach nós temos o comportamento contrário, não retornamos nada mas conseguimos alterar os valores da array original.
Show irei implementar quando chegar em casa, e te dou um feedback.
Obrigado!
TS não é minha especialidade, mas consigo ver erros nas respostas sugeridas.
A primeira solução está tipando array: number[]
porém a 'array' seria do tipo '{}[]' ou seja, uma array de objetos.
A segunda solução tem 2 erros. Ambos ocorrem no seu código.
1 - A array de objetos está sendo inicializada dentro da função, logo, cada vez que você chamar a função, todos os números serão criados novamente de forma inativa, não há memória salvando os que foram ativados.
2 - Na ativação está sendo feito active: item.value === numbers
, ou seja, mesmo se a função "decorasse" que o 10 já foi ativado, quando fosse a interação do 14, essa comparação retornaria FALSE, o que desativaria o 10 novamente.
O código abaixo eu fiz num editor online e funcionou:
function sorteiaNumero(numberArray: {value: number, active: boolean}[], numbers: number) {
const newArray = numberArray.map(item => {
return {
...item,
active: item.active? true : item.value === numbers
}
})
console.log(newArray);
return newArray
}
let numberArray = Array.from({ length: 60 }, (_, i) => ({ value: i, active: false }))
numberArray = sorteiaNumero(numberArray, 10)
numberArray = sorteiaNumero(numberArray, 14)
Repare que eu crio o 'numberArray' fora do escopo da função, e cada vez que eu chamo a função eu reatribuo os valores da 'numberArray', dessa forma, fica memorizado o número que foi ativado anteriormente.
Provavelmente dá pra refatorar, eu fiz "na pressa", mas acho que te atende por hora.
Obrigado pela explicação irmão, com certeza irei estudar suas dicas!
Fico agradecido por disponibilizar do seu tempo em ajudar o próximo!
Que Deus te abençoe!