Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[JavaScript: Conhecendo Objetos] [Módulo: 05 -Manipulando Lista de Objetos][Item: 09 - Lista de Exercícios] - Exercício 5

Oi pessoal, tudo bem?

Fiz duas possibilidades para o exercício 5. A menos que eu não esteja vendo alguma coisa importante, as duas chegaram na mesma conclusão, mas ambas estão um pouco diferente da resolução proposta pela professora. Na proposta, ela coloca um "for...of" para varrer o array de objetos raíz e depois ela aplica um método de array "find" para poder encontrar o valor que foi passado como argumento da função. No meu caso testei outras duas possibildiades:

Aqui eu usei um método filter pra poder "filtrar" os elementos do array com os objetos da raíz e depois apliquei um find somente nos objetos que estão dentro desse array e que contemplam as informações de matrícula que será usada no argumento da função para acessar a condição de existência daquele funcionário.

function encontrarFuncionarioPorId(idFuncionario){
    let mensagemFunc = '*** FUNCIONÁRIO NÃO FOI ENCONTRADO ***';
    listaFuncionarios.filter(listaCompletaFunc => {
        listaCompletaFunc.nomeFuncionariosDepto.find(matriculasFuncObj => {
            if (matriculasFuncObj.matriculafunc === idFuncionario){
                const mensagemFuncEncontrado = (` *** FUNCIONÁRIO ENCONTRADO *** \n Nome: ${matriculasFuncObj.nomefunc}\n Cargo: ${matriculasFuncObj.cargo}\n Departamento: ${listaCompletaFunc.nomeDepto}`)
                mensagemFunc = mensagemFuncEncontrado;
                return mensagemFunc
            }
        })
    } )
return mensagemFunc
}

** Possibilidade 2** - Usando dois "for... of" recursivamente.

Aqui ficou um pouco mais enxuto, usei dois for ... of. O primeiro para varrer os elementos do objeto raíz e o segundo para acessar somente os objetos que contenham o id que será usado como parâmetro da função e como validador da condição de existência do ID que está sendo procurando na condicional.

function encontrarFuncionarioPorId(idFuncionario){
    let mensagemErro = "*** FUNCIONÁRIO NÃO FOI ENCONTRADO ***";
    for (const infoFunc of listaFuncionarios){
        for (const matFunc of infoFunc.nomeFuncionariosDepto){
            if(matFunc.matriculafunc === idFuncionario){
                mensagemSucesso = (`*** FUNCIONÁRIO ENCONTRADO ***\n Matrícula: ${matFunc.matriculafunc}\n Nome: ${matFunc.nomefunc}\n Departamento: ${infoFunc.nomeDepto}`)
                mensagemErro = mensagemSucesso;
                return mensagemErro;
             }
        }
    }
    return mensagemErro
}

Gostaria da avaliação dos deuses especialistas daqui pra saber se estou correto quanto a minha resolução e também se meu código está muito verboso a ponto de gerar muita ineficiência de processamento, visto que a resolução da professora está bastante enxuta.

Muuuiito Obrigado sempre!

1 resposta
solução!

Oi, Rafael! Tudo bem?

Que bom que você está explorando diferentes abordagens para resolver o exercício! Isso é uma ótima maneira de aprender e entender melhor como o JavaScript funciona.

A primeira abordagem usando filter e find é super interessante, mas talvez um pouco mais complexa do que o necessário para este caso, pois o filter retorna um novo array com todos os elementos que passam no teste implementado pela função fornecida, enquanto o find retorna o primeiro elemento que passa no teste. No entanto, como estamos procurando um único funcionário, o uso do filter pode ser um pouco excessivo, já que só precisamos encontrar um elemento.

Já a segunda abordagem, usando dois for...of, é mais direta e clara, estamos iterando sobre os departamentos e, em seguida, sobre os funcionários dentro de cada departamento e quando encontramos o funcionário com a matrícula desejada, retornamos a mensagem de sucesso. Essa abordagem é eficiente e fácil de entender, além de ser bastante comum em situações onde você precisa iterar sobre estruturas de dados aninhadas.

Sobre a questão da eficiência, ambas as abordagens têm complexidade similar, mas a segunda pode ser ligeiramente mais eficiente, pois interrompe a busca assim que encontra o funcionário, enquanto a primeira pode continuar a filtragem mesmo após encontrar o resultado desejado.

Ambas as soluções são válidas, mas a segunda pode ser preferida por sua simplicidade e eficiência. Continue explorando e testando diferentes abordagens, isso é fundamental para se tornar um programador mais versátil!

Espero ter ajudado!

Um forte abraço e bons estudos!