Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/maiarasanto/desafio-javascript

desafios feito em Java Script
https://github.com/maiarasanto/desafio-javascript

arrays condicionais functions javascript npm object

Last synced: 6 days ago
JSON representation

desafios feito em Java Script

Awesome Lists containing this project

README

        

# Repositório do projeto Magic Functions!

Desenvolva seu projeto a partir deste repositório, utilizando uma branch específica e um _Pull Request_ para enviar seus códigos.


# Orientações

Antes de começar a desenvolver

1. Clone o repositório

* Use o comando: `git clone [email protected]:UnifelDesenvolvimentoWeb/magic-functions.git`

* Entre na pasta do repositório que você acabou de clonar:

* `cd magic-functions`

2. Instale as dependências

* Para isso, use o seguinte comando: `npm install`

3. Crie uma branch a partir da branch `master`

* Verifique se você está na branch `master`
* Exemplo: `git branch`
* Se não estiver, mude para a branch `master`
* Exemplo: `git checkout master`
* Agora, crie uma branch para qual você vai submeter os `commits` do seu projeto:
* Você deve criar uma branch no seguinte formato: `nome-de-usuario-nome-do-projeto`
* Exemplo: `git checkout -b maria-magic-functions`

4. Desenvolva algum requisito do projeto e logo em seguida adicione as mudanças ao _stage_ do Git e faça um `commit`
* Verifique que as mudanças ainda não estão no _stage_
* Exemplo: `git status` (os arquivos no diretório `src` devem aparecer em vermelho)

* Adicione o novo arquivo ao _stage_ do Git
* Exemplo: `git add .` (adicionando todas as mudanças - _que estavam em vermelho_ - ao stage do Git)
* `git status` (deve aparecer listado os arquivos do diretório `src` em verde)

* Faça o `commit` inicial
* Exemplo: `git commit -m 'iniciando o projeto - requisito 01.'` (fazendo o primeiro commit)
* `git status` (deve aparecer uma mensagem tipo _nothing to commit_ )

5. Adicione a sua branch com o novo `commit` ao repositório remoto

* Usando o exemplo anterior: `git push -u origin maria-magic-functions`

**Atenção: essa etapa de PR só executa uma vez**

6. Crie um novo `Pull Request` _(PR)_
* Vá até a página de _Pull Requests_ do [repositório no GitHub](https://github.com/UnifelDesenvolvimentoWeb/magic-functions/pulls)
* Clique no botão verde _"New pull request"_
* Clique na caixa de seleção _"Compare"_ e escolha a sua branch **com atenção**
* Coloque um título para o seu _Pull Request_
* Exemplo: _"Cria tela de busca"_
* Clique no botão verde _"Create pull request"_
* Adicione uma descrição para o _Pull Request_ e clique no botão verde _"Create pull request"_
* Volte até a [página de _Pull Requests_ do repositório](https://github.com/UnifelDesenvolvimentoWeb/magic-functions/pulls) e confira que o seu _Pull Request_ está criado.

Durante o desenvolvimento


* Faça `commits` das alterações que você fizer no código regularmente;

* Lembre-se de sempre após um (ou alguns) `commits` atualizar o repositório remoto;

* Os comandos que você utilizará com mais frequência são:

1. `git status` _(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)_;

2. `git add` _(para adicionar arquivos ao stage do Git)_;

3. `git commit` _(para criar um commit com os arquivos que estão no stage do Git)_;

4. `git push -u origin nome-da-branch` _(para enviar o commit para o repositório remoto na primeira vez que fizer o `push` de uma nova branch)_;

5. `git push` _(para enviar o commit para o repositório remoto após o passo anterior)_.

Testes

Para que os testes sejam executados localmente, verifique se a versão do node na sua máquina é a `16` ou superior:

```bash
node -v
```

Caso a versão seja diferente, você pode utilizar o `nvm` para trocar de versão com o seguinte comando:

```bash
nvm use 16
```

Para testar todas funções no terminal, basta executar o comando abaixo:

```bash
npm test
```

Caso queira testar apenas uma função rode o comando abaixo:

```bash
npm test nome-do-arquivo
```

Por exemplo:

```bash
npm test 11-averageRatingByGenre.test
```
Ou somente o número:
```bash
npm test 11
```

---

# Requisitos

## 1. Implemente a função `getAllTitles`


A função getAllTitles é responsável por recuperar um array de títulos de filmes a partir de uma lista de filmes fornecida.

- Faça com que a função `getAllTitles` possa receber vários parâmetros;

- Retorne um array de títulos de filmes quando a função é chamada com entrada válida.;

- Retorne um array vazio quando a função é chamada com um array de entrada vazio.

**O que será testado:**

Caso receba um array de filmes por ex:
[ {
id: 1,
titulo: "Cidade de Deus",
diretor: "Fernando Meirelles",
genero: ["Drama", "Crime"],
...
},
{
id: 2,
titulo: "Jogos Mortais",
diretor: "James Wan",
genero: ["Terror", "Suspense"],
...
}
...
]

Exemplo de saída:

["Cidade de Deus", "Jogos Mortais", ...]

---

## 2. Implemente a função `getMovieById`


A função getMovieById é responsável por recuperar o objeto de filme com o ID fornecido.

- A função recebe o parâmetro `id`: que representa o id do filme a ser pesquisado.

- Utilize diretamente na função os filmes que vem no array de objetos que se encontra dentro do arquivo

- Retorne o objeto completo do filme com o ID fornecido. O objeto retornado deve ser igual ao filme correspondente no array de filmes.

- Deve retornar undefined se nenhum filme com o ID fornecido for encontrado.

- Deve retornar undefined se o parâmetro de ID não for fornecido.

- Deve retornar undefined se o parâmetro de ID não for um número.

- Deve retornar undefined se o parâmetro de ID não for fornecido.

**O que será testado:**

- Ao passar um ID de um filme é retornado o objeto respectivamente de ID

---

## 3. Implemente a função `moviesWithActor`


Encontre filmes que incluam um determinado ator em seu elenco.

- A função recebe o parâmetro `actor`: Uma string que representa o nome do ator a ser pesquisado.

- Utilize diretamente na função os filmes que vem no array de objetos que se encontra dentro do arquivo

- Retorne uma lista de objetos de filmes que representam os filmes que incluem o ator dado. Se nenhum filme corresponder aos critérios, um array vazio será retornada.

**O que será testado:**

- A função deve pesquisar em uma coleção de filmes e suas informações de elenco associadas.
Deve identificar filmes que possuem o ator especificado em seu elenco.
Deve retornar um array contendo esses filmes correspondentes.

---

## 4. Implemente a função `bestRatedFilm`


Encontre o filme com a classificação mais alta em uma lista de filmes.

- Recebe o parâmetro `movies`: Uma lista de objetos de filmes, onde cada objeto possui uma propriedade `rating` que representa a classificação do filme.

- Retorna o filme com a classificação mais alta na lista. Se a lista estiver vazia, retorna `undefined`

**O que será testado:**

- Se houver vários filmes com a classificação mais alta quando fornecida uma lista de filmes com classificações válidas, a função deve retornar o primeiro filme encontrado na lista.

- Se a lista estiver vazia, a função deve retornar `undefined`

---

## 5. Implemente a função `titlesAndDirectors`


Imprima os títulos e diretores de cada filme em uma lista de filmes.

- Recebe o parâmetro `movies` que é um array contendo a lista de filmes

**O que será testado:**

- A função deve iterar pelo array de filmes e imprimir no console o título e o diretor de cada filme no formato `"Título: {título} - Diretor: {diretor}"`.
Deve lidar com diferentes cenários de entrada:
Listas vazias não devem produzir nenhuma saída.
Listas com um único filme devem imprimir as informações desse filme.

---

## 6. Implemente a função `filmSorted`


Ordene uma lista de filmes de acordo com o ano de lançamento

- Recebe o parâmetro `movies` que é um array contendo a lista de filmes

- Retorne uma nova lista de filmes ordenada pelo ano de lançamento, em ordem crescente.

**O que será testado:**

- A função deve criar um novo array de filmes ordenada pelo ano de lançamento.
Não deve modificar o array original de filmes que foi fornecida como entrada.
Deve lidar com diferentes cenários de entrada:
array vazios devem resultar em array vazios.

---

## 7. Implemente a função `filmsAvailable`


Filtrar uma lista de filmes e retornar apenas os títulos dos filmes que estão disponíveis, com base na propriedade disponivel de cada objeto de filme.

- Recebe o parâmetro `movies` que é um array contendo a lista de filmes

- Retorna uma array de títulos de filmes disponíveis, onde cada título é uma string.

**O que será testado:**
- Identificar os filmes que possuem a propriedade disponivel como true.
Deve criar um novo array contendo apenas os títulos desses filmes disponíveis.
Deve lidar com diferentes cenários de entrada:
array vazios devem resultar em array vazios.
array com todos os filmes indisponíveis devem resultar em array vazios.

---

## 8. Implemente a função `nolanFilms`


Filtrar e ordenar uma lista de filmes, retornando apenas os filmes dirigidos por Christopher Nolan, ordenados pela classificação em ordem decrescente.

- Recebe o parâmetro `movies` que é um array contendo a lista de filmes

- Deve filtrar, mantendo apenas esses filmes dirigidos por Nolan.

- Deve classificar o array filtrado pela propriedade avaliacao em ordem decrescente.

- Deve retornar o array ordenado.

**O que será testado:**

- Retorne um novo array contendo apenas os filmes dirigidos por Christopher Nolan, ordenados pela classificação em ordem decrescente.

---

## 9. Implemente a função `findActorForTheMovie`


Encontre os dois primeiros atores no elenco de um filme, dada uma string representando o título do filme.

- Utilize diretamente na função os filmes que vem no array de objetos que se encontra dentro do arquivo

- Recebe o parâmetro `movieTitle`: Uma string representando o título do filme.

- Retorne um array contendo os dois primeiros nomes de atores do elenco do filme, ou uma mensagem de erro caso o filme não seja encontrado, ou o elenco seja indefinido, ou o título seja inválido.

**O que será testado:**

- Caso o filme seja encontrado, a função deve retornar um array contendo os dois primeiros nomes de atores do elenco do filme.

- Caso o filme não seja encontrado, ou o elenco seja indefinido, ou o título seja inválido, a função deve retornar uma mensagem de erro específica para cada caso.

- A função deve retornar uma mensagem de erro `"Filme não encontrado."` quando fornecido um título inválido.

- A função deve retornar uma mensagem de erro `"Filme não encontrado."` quando o filme possui elenco indefinido ou quando o título for nulo ou quando o título for uma string vazia..

---

## 10. Implemente a função `countGenres`


Contar a ocorrência de gêneros em uma lista de filmes e retornar um objeto com a contagem de cada gênero.

- Recebe o parâmetro `movies` que é um array contendo a lista de filmes

- A função deve retornar um objeto vazio quando a lista de filmes estiver vazia.

- A função deve lidar corretamente com filmes que possuem gêneros repetidos, contabilizando-os de forma adequada.

- A função deve retornar um objeto vazio quando todos os filmes na lista não possuem gêneros.

**O que será testado:**

- Retorne um objeto onde as chaves são os nomes dos gêneros e os valores são as respectivas contagens de ocorrências.

- Recebendo um array de filmes deve retornar:
- Exemplo de saída:
[
"Aventura": 5,
"Ação": 7,
"Comédia": 1,
"Drama": 4,
...
]

---

## 11. Implemente a função `averageRatingByGenre`


Calcular e retornar a média de avaliação dos filmes de um determinado gênero.

- Recebe o parâmetro `genre`: Uma string representando o gênero do filme.

- Utilize diretamente na função os filmes que vem no array de objetos que se encontra dentro do arquivo

- A função deve buscar todos os filmes do gênero fornecido

- Caso não haja filmes para o gênero fornecido, a função deve retornar uma mensagem informando isso.

- Se houver filmes do gênero, a função deve calcular a soma de suas avaliações e dividir pelo número de filmes.

- A média de avaliação deve ser formatada com duas casas decimais e inserida em uma string informativa.

**O que será testado:**

- Retorne uma string contendo a média de avaliação dos filmes do gênero fornecido, formatada com duas casas decimais, ou uma mensagem de erro indicando:
- Ausência de filmes para o gênero fornecido.
- Parâmetro genre ausente, inválido (não string) ou vazio.

- a função deve retornar a mensagem `"O parâmetro é obrigatório."` quando a função não receber o parâmetro `genre` ou quando for uma `string` vazia no parâmetro

- a função deve retornar a mensagem `"O parâmetro tem que ser uma string."` quando a função receber no parâmetro `genre` um valor do tipo `number`

- a função deve retornar a mensagem `"Não há filmes do gênero Filme Clássico."` quando por exemplo a função receber no parâmetro `genre` um valor `"Filme Clássico"`

---

## 12. Implemente a função `filmSeparation`


Separar filmes por gênero e ordená-los alfabeticamente por título.

- Recebe o parâmetro `movies` que é um array de objetos contendo a lista de filmes

- Recebe o parâmetro `details` que é um booleano com padrão `true`. Parâmetro opcional indicando se deve incluir detalhes dos filmes na separação.

- Para cada filme:
Criar uma lista para o gênero correspondente se ele ainda não existir no objeto de saída.
Adicionar o filme à lista do gênero correspondente.
Se o parâmetro details for true, incluir os detalhes do filme no objeto adicionado.
Ordenar alfabeticamente cada objeto de filmes por título.
Retornar o objeto final contendo todos os gêneros e seus filmes separados.

- A função deve separar os filmes corretamente por gênero, mesmo quando cada filme possui vários gêneros.
- A função deve ordenar alfabeticamente os filmes dentro de cada gênero.
- A função deve excluir os detalhes dos filmes quando o parâmetro `details` for `false`.
- A função deve retornar um objeto vazio quando a lista de filmes estiver vazia.
- A função deve retornar um objeto vazio quando a lista de filmes estiver vazia.
**O que será testado:**
- Retorna um objeto onde as chaves são os gêneros e os valores são listas de objetos de filmes pertencentes a esses gêneros. Cada objeto de filme pode incluir detalhes se o parâmetro details for true.

- Quando o parâmetro de `details` for `true`
Exemplo de saída:
{
"Comédia": [{"anoLancamento": 2009, "avaliacao": 7.7, "diretor": "Todd Phillips", "id": 25, "titulo": "Se Beber, Não Case"}],
"Drama": [{"anoLancamento": 2018, "avaliacao": 7.5, "diretor": "John Krasinski", "id": 24, "titulo": "Um Lugar Silencioso"}],
"Suspense": [{"anoLancamento": 2018, "avaliacao": 7.5, "diretor": "John Krasinski", "id": 24, "titulo": "Um Lugar Silencioso"}],
}

- Quando o parâmetro de `details` for `false`
Exemplo de saída: {
"Aventura": ["Gladiador"], "Ação": ["Gladiador"],
"Comédia": ["Esqueceram de Mim"],
"Drama": ["A Chegada", "Clube da Luta", "Gladiador", "Interestelar"],
}

---

## 13. Implemente a função `listOverdueLoans`


Listar os empréstimos de filmes que estão atrasados.

- Recebe o parâmetro `movies` que é um array contendo a lista de filmes

- `movies`: Uma lista de objetos de filmes, onde cada objeto possui propriedades como id, titulo, emprestimos (lista de objetos de empréstimos com propriedades como dataEmprestimo e dataDevolucao).

- Para cada empréstimo:
Verificar se a `dataDevolucao` é anterior à data atual (considerando a data atual do sistema).
Se estiver atrasado, adicionar o empréstimo ao array de objetos de empréstimos atrasados, incluindo as propriedades status e id do filme.
Retornar a lista de empréstimos atrasados.

Dica: pesquise sobre a implementação de new Date();

- A função deve retornar um array vazio quando o array de filmes estiver vazia.

- A função deve retornar um array de objetos contendo apenas os empréstimos atrasados.

- A função deve retornar um array vazio quando não houver empréstimos atrasados.

- A função deve retornar um array vazio quando nenhum filme possuir empréstimos.

- A função deve retornar um array vazio quando todos os empréstimos ainda não estiverem vencidos.

**O que será testado:**

- Retorna um array de objetos de empréstimos que estão atrasados, onde cada objeto possui propriedades como `id`, `titulo`, `dataEmprestimo`, `dataDevolucao` e `status` (definido como "atrasado").

---

## 14. Implemente a função `classifyMovies`


Classificar filmes em diferentes categorias com base na avaliação e disponibilidade.

- Recebe o parâmetro `movies` que é um array contendo a lista de filmes

- Para cada filme:
Classificar o filme por avaliação, adicionando-o à lista correspondente dentro do objeto avaliacao.
Classificar o filme por disponibilidade, adicionando-o à lista correspondente dentro do objeto disponibilidade.
Retornar o objeto final contendo a classificação dos filmes.

- A função deve retornar um objeto com as propriedades avaliacao e disponibilidade, cada uma com as subpropriedades esperadas.

- A função deve classificar os filmes em três intervalos de avaliação e ordená-los por título dentro de cada intervalo.

- A função deve classificar os filmes como disponíveis ou indisponíveis e ordená-los por título dentro de cada categoria.

- A função deve retornar um objeto com listas vazias para todas as categorias quando a entrada estiver vazia.

- A função deve retornar uma lista vazia para filmes indisponíveis quando todos os filmes estiverem disponíveis.

**O que será testado:**

- Um objeto contendo as seguintes propriedades:
`avaliacao`: Um objeto com três chaves representando intervalos de avaliação `("0-4.9", "5.0-7.9", "8.0-10.0")`. Cada chave possui um valor que é uma lista de filmes ordenados por título dentro do intervalo de avaliação correspondente.
`disponibilidade`: Um objeto com duas chaves:
`disponiveis`: Uma lista de filmes disponíveis (propriedade disponivel como true) ordenados por título.
`naoDisponiveis`: Uma lista de filmes indisponíveis (propriedade disponivel como false) ordenados por título.

- Quando informa um array de objetos contendo a lista de filmes
Exemplo de saída: {
avaliacao: {
'0-4.9': [],
'5.0-7.9': [
{
titulo: "A Chegada",
diretor: "Denis Villeneuve",
genero: ["Ficção Científica", "Drama"],
anoLancamento: 2016,
avaliacao: 7.9,
},
{
titulo: "Amor Além da Vida",
diretor: "Vincent Ward",
genero: ["Romance", "Fantasia"],
anoLancamento: 1998,
avaliacao: 7.1,
},
{
titulo: "Esqueceram de Mim",
diretor: "Chris Columbus",
genero: ["Comédia", "Família"],
anoLancamento: 1990,
avaliacao: 7.6,
}
],}
}