4
respostas

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

Oi pessoal, tudo bem? Pedindo mais uma ajuda no fórum, porfas!

Estou tentando resolver o exercício 2 utilizando a callback filter, mas colocando uma condicional dentro da função callback que irá fazer a verificação do ano de lançamento do filme. No entanto, quando a condição não é satisfeita (o "if" não é atendido) estou com dificuldades de fazer com que o programa retorne os dados consolidados após todas as iterações sobre os objetos forem feita. Eu não quero que seja apresentado o valor do "else" para toas as iterações. Veja que criei uma variável de mensagem ('msgNotFound') para caso o ano de lançamento não seja encontrado.

Entendo que para cada iteração, o código vai passar pela possibilidade de o ano não é encontrado, já que nem todos os filmes da lista foram lançados no mesmo ano. Entretanto, como eu posso fazer para que o código exiba essa mensagem somente quando NENHUM filme possuir o ano que está sendo usado na comparação?

Meu código:

const listaFilmes = require("./estanteFilmes.json")

const msgNotFound = console.log("Filme não encontrado")


function filtrarfilmesPorAno(anoFilmeUser){
    const filmesAnoUser = listaFilmes.filter(filmes => {
        if(filmes.anoLancamento === anoFilmeUser){
            return filmes
        }
     else{
            return msgNotFound;
        }
    })
    console.log(filmesAnoUser)
}

filtrarfilmesPorAno(1994)

Aqui minha base de dados que salvei como estanteLivros.json

[{
    "id": 1,
    "titulo": "ET o Extraterrestre",
    "diretor": "Steven Spilberg" ,
    "anoLancamento": 1982
    
},
{
    "id": 2,
    "titulo": "O protetor",
    "diretor": "Antoine Fuqua" ,
    "anoLancamento": 2014

},
{
    "id": 3,
    "titulo": "Assassinos por Natureza",
    "diretor": "Oliver Stone" ,
    "anoLancamento": 1994
},
{
    "id": 5,
    "titulo": "O Máskara",
    "diretor": "Chuck Russell" ,
    "anoLancamento": 1994
},
{
    "id": 6,
    "titulo": "Rambo",
    "diretor": "Ted Kotcheff" ,
    "anoLancamento": 1985
},
{
    "id": 7,
    "titulo": "Blade Runner, o Caçador de Andróides",
    "diretor": "Ridley Scott" ,
    "anoLancamento": 1985
}
]
'''
4 respostas

Atualizando...

Encontrei um caminho que pode não ser o mais eficiente, mas aparentemente resolve a lógica. Vejam se concordam, e se tiver uma possiblidade mais inteligente, fiquem à vontade para contribuir.

Agora estou verificando o tamanho do array que filtra os filmes, caso ele seja zero, o que significa que nenhuma interação retornou o valor buscado, ele exibe a mensagem de que o filme não foi encontrado . Marquei a atualização com: **** atualizado à partir daqui ****

const listaFilmes = require("./estanteFilmes.json")

//const msgNotFound = "Filme não encontrado"
function filtrarfilmesPorAno(anoFilmeUser){
    const msgNotFound = "Filme não encontrado";
    const filmesFiltrados = listaFilmes.filter(filmes => {
        if(filmes.anoLancamento === anoFilmeUser){            
            return filmes;
        }
    })
    // **** atualizado à partir daqui **** //
    if (filmesFiltrados.length == 0){        
        return msgNotFound
    }
    else {
        return filmesFiltrados
    }
    
    }

const retornoFuncBuscaFilmes = filtrarfilmesPorAno(1920); // para testar o caso de não encontrar nenhuma incidência de filme
const retornoFuncBuscaFilmes = filtrarfilmesPorAno(1985); // para o caso de encontrar 2 filmes possíveis

console.log(retornoFuncBuscaFilmes)
console.log(retornoFuncBuscaFilmes2)

Olá, Rafael! Como vai?

Como solução para o seu problema e garantir que a mensagem "Filme não encontrado" seja exibida apenas quando nenhum filme do ano especificado for encontrado, você pode utilizar a função filter para filtrar os filmes e, em seguida, verificar se a lista filtrada está vazia. Se estiver vazia, exiba a mensagem.

Vou mostrar como fazer isso com uma leve modificação no seu código:

const listaFilmes = require("./estanteFilmes.json");

function filtrarFilmesPorAno(anoFilmeUser) {
    const filmesFiltrados = listaFilmes.filter(filmes => filmes.anoLancamento === anoFilmeUser);
    
    if (filmesFiltrados.length === 0) {
        console.log("Filme não encontrado");
    } else {
        console.log(filmesFiltrados);
    }
}

// Testando a função
filtrarFilmesPorAno(1994); // Deve mostrar os filmes de 1994
filtrarFilmesPorAno(1920); // Deve exibir "Filme não encontrado"

Neste exemplo, a função filtrarFilmesPorAno filtra os filmes pelo ano informado. Após a filtragem, verificamos se o array filmesFiltrados está vazio. Se estiver, exibimos a mensagem de que nenhum filme foi encontrado; caso contrário, exibimos os filmes encontrados.

Dessa forma, você consegue controlar a exibição da mensagem de forma adequada.

Estamos à disposição para mais dúvidas!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Oi Armano, tudo jóia? Muito obrigado pela sua sugestão, parece que está bastnte em linha com o complemento que eu adicionei no segundo post. Também optei pelo caminho de verificar o tamanho do vetor para poder gerar a saída false.

No entanto, percebi que na sua sugestão, você não tem como prática usar o "return" para devolver os resultados das funções. Isso tem algum motivo ou é somente uma escolha pessoal? Por ser uma "function" eu acabo sempre optando por fazer as saídas via "return" para caso exista necessidade de usar a saída em outra função ou algum módulo.

Opa, Rafael!

O fato de eu não ter usado o return na função que trouxe de exemplo é por escolha pessoal, pois é melhor fazer uma função que já printa os resultados ao ser chamada em vez de retornar um valor, já que não vou usar esse valor outra vez por se tratar de um exemplo apenas desse trecho.