Skip to content

Curso que realizei na Trybe, aqui você encontra o projeto concluído. 👍

Notifications You must be signed in to change notification settings

EduSouza-programmer/Trybe_Projeto_8-5_Edu_Souza

Repository files navigation

Imagem trybe

Curso realizado na Trybe - Edu Souza o/

“Não há satisfação maior do que aquela que sentimos quando proporcionamos alegria aos outros - M. Taniguchi”

Repositório - Zoo functions


Made by Eduardo Souza   Github page Edu_Souza   License

Sobre o projeto    |    Entrega    |    Licença

🚀 Sobre o projeto

Zoo functions

Você irá simular um sistema de relatório de um zoológico. O sistema possui informações a respeito dos animais presentes no zoológico, colaboradores, horários de funcionamento e uma tabela de preços que varia de acordo com a idade das pessoas que o visitam.

Você desenvolverá um conjunto de funções capazes de recuperar vários tipos de informações acerca do zoológico e de seu funcionamento, utilizando os conceitos de JavaScript.

📮 Entrega

📋 Sumário

  • 📌 1. Implemente a função animalsByIds

  • 📌 2. Implemente a função animalsOlderThan

  • 📌 3. Implemente a função employeeByNam

  • 📌 4. Implemente a função createEmployee

  • 📌 5. Implemente a função isManager

  • 📌 6. Implemente a função addEmployee

  • 📌 7. Implemente a função animalCount

  • 📌 8. Implemente a função entryCalculator

  • 📌 9. Implemente a função animalMap

  • 📌 10. Implemente a função schedule

  • 📌 11. Implemente a função oldestFromFirstSpecies

  • 📌 12. Implemente a função increasePrices

  • 📌 13. Implemente a função employeeCoverage


📚 Exercícios

Implemente a função animalsByIds:
  • Caso receba nenhum parâmetro, necessário retornar um array vazio
  • Ao receber como parâmetro um único id, retorna os animais com este id
  • Ao receber mais de um id, retorna os animais que têm um desses ids

Resposta:

✏️ Código Javascript
function animalsByIds(...ids) {
  // seu código aqui
  return data.animals.filter(({ id }) => ids.includes(id));
}

Back Sumário

Implemente a função animalsOlderThan:
  • Ao passar o nome de uma espécie e uma idade, testa se todos os animais desta espécie possuem a idade mínima especificada

Resposta:

✏️ Código Javascript
function animalsOlderThan(animal, age) {
  // seu código aqui
  return data.animals
    .find(({ name }) => name === animal)
    .residents.every(({ age: ageRes }) => ageRes >= age);
}

Back Sumário

Implemente a função employeeByName:
  • Sem parâmetros, retorna um objeto vazio
  • Quando provido o primeiro nome do funcionário, retorna o objeto do funcionário
  • Quando provido o último nome do funcionário, retorna o objeto do funcionário

Resposta:

✏️ Código Javascript
function employeeByName(employeeName) {
  return (
    data.employees.find(
      ({ firstName, lastName }) => employeeName === firstName || employeeName === lastName) || {}
  );
}

Back Sumário

Implemente a função createEmployee:
  • Cria um novo colaborador a partir de objetos contendo informações pessoais e gerentes e animais gerenciados.

Resposta:

✏️ Código Javascript
function createEmployee(personalInfo, associatedWith) {
  // seu código aqui
  return {
    ...personalInfo,
    ...associatedWith,
  };
}

Back Sumário

Implemente a função isManager:
  • Testa se o id passado é de um gerente

Resposta:

✏️ Código Javascript
function isManager(id) {
  return data.employees.some(({ managers }) => managers.some(idManage => id === idManage));
}

Back Sumário

Implemente a função addEmployee:
  • Adiciona um funcionário no fim da lista

Resposta:

✏️ Código Javascript
function addEmployee(id, firstName, lastName, managers = [], responsibleFor = []) {
  data.employees.push({ id, firstName, lastName, managers, responsibleFor });
}

Back Sumário

Implemente a função animalCount:
  • Sem parâmetros, retorna animais e suas quantidades
  • Com o nome de uma espécie de animal, retorna somente a quantidade

Resposta:

✏️ Código Javascript
function animalCount(species) {
  if (!species) {
    return data.animals.reduce((acc, { name, residents }) => {
      acc[name] = residents.length;
      return acc;
    }, {});
  }

  return data.animals.find(({ name }) => name === species).residents.length;
}

Back Sumário

Implemente a função entryCalculator:
  • Retorna 0 se nenhum argumento for passado
  • Retorna 0 se um objeto vazio for passado
  • Retorna o preço total a ser cobrado dado o número de adultos, crianças e idosos

Resposta:

✏️ Código Javascript
function entryCalculator(entrants) {
  // seu código aqui
  if (entrants === undefined || Object.keys(entrants).length === 0) return 0;

  const { Adult = 0, Senior = 0, Child = 0 } = entrants;
  const totalAdult = data.prices.Adult * Adult;
  const totalSenior = data.prices.Senior * Senior;
  const totalChild = data.prices.Child * Child;

  return totalAdult + totalSenior + totalChild;
}

Back Sumário

Implemente a função animalMap:
  • Sem parâmetros, retorna animais categorizados por localização
  • Com a opção includeNames: true especificada, retorna nomes de animais
  • Com a opção sorted: true especificada, retorna nomes de animais ordenados
  • Com a opção sex: 'female' ou sex: 'male' especificada, retorna somente nomes de animais macho/fêmea
  • Com a opção sex: 'female' ou sex: 'male' especificada e a opção sort: true especificada, retorna somente nomes de animais macho/fêmea com os nomes dos animais ordenados
  • Só retorna informações ordenadas e com sexo se a opção includeNames: true for especificada

Resposta:

✏️ Código Javascript
function filterTheAnimalBySex(sexName, residents) {
  const genderFilteredByName = residents
    .filter(({ sex }) => sex === sexName)
    .map(({ name }) => name);
  const sexNameEmpty = residents.map(({ name }) => name);

  return sexName ? genderFilteredByName : sexNameEmpty;
}

function getTheAnimalBySexOrNot(sex, residents) {
  const noGenderSpecified = filterTheAnimalBySex(sex, residents);
  const sexAnimals = {
    female: filterTheAnimalBySex(sex, residents),
    male: filterTheAnimalBySex(sex, residents),
  };
  return sex ? sexAnimals[sex] : noGenderSpecified;
}

function emptyParameters() {
  return data.animals.reduce((acc, { name, location }) => {
    if (acc[location] === undefined) {
      acc[location] = [name];
    } else acc[location].push(name);
    return acc;
  }, {});
}

function getAnimals(residents, specie, sorted, sex) {
  if (!sorted) {
    return {
      [specie]: getTheAnimalBySexOrNot(sex, residents),
    };
  }
  return {
    [specie]: getTheAnimalBySexOrNot(sex, residents).sort(),
  };
}

function outputAnimalMap(includeNames, sorted, sex) {
  if (includeNames) {
    return data.animals.reduce((acc, { name: specie, location, residents }) => {
      if (acc[location] === undefined) {
        acc[location] = [getAnimals(residents, specie, sorted, sex)];
      } else {
        acc[location].push(getAnimals(residents, specie, sorted, sex));
      }
      return acc;
    }, {});
  }
  return emptyParameters();
}

function animalMap(options) {
  if (!options) return emptyParameters();
  const { includeNames = false, sorted = false, sex = '' } = options;
  return outputAnimalMap(includeNames, sorted, sex);
}

Back Sumário

10°

Implemente a função schedule:
  • Sem parâmetros, retorna um cronograma legível para humanos
  • Se um único dia for passado, retorna somente este dia em um formato legível para humanos

Resposta:

✏️ Código Javascript
function schedule(dayName) {
  const days = Object.keys(hours);
  const completedSchedule = {};

  days.forEach((day) => {
    if (day !== 'Monday') {
      completedSchedule[day] = `Open from ${hours[day].open}am until ${
        hours[day].close - 12
      }pm`;
    } else {
      completedSchedule[day] = 'CLOSED';
    }
  });

  return dayName
    ? { [dayName]: completedSchedule[dayName] }
    : completedSchedule;
}

Back Sumário

11°

Implemente a função oldestFromFirstSpecies:
  • Passado o id de um funcionário, encontra a primeira espécie de animal gerenciado pelo funcionário, e retorna um array com nome, sexo e idade do animal mais velho dessa espécie

Resposta:

✏️ Código Javascript
function oldestFromFirstSpecies(id) {
  // seu código aqui
  const animalManagedByEmployeeId = data.employees.find(
    ({ id: employeeId }) => employeeId === id).responsibleFor[0];

  const findAnimalById = data.animals
    .find(({ id: animalId }) => animalId === animalManagedByEmployeeId)
    .residents.sort(({ age: ageA }, { age: ageB }) => ageB - ageA);

  return Object.values(findAnimalById[0]);
}

Back Sumário

12°

Implemente a função increasePrices:
  • Ao passar uma porcentagem, incrementa todos os preços, arrendondados em duas casas decimais

Resposta:

✏️ Código Javascript
function increasePrices(percentage) {
  const calPercentage = 1 + (percentage / 100);
  Object.keys(prices).forEach((price) => {
    prices[price] = `${parseFloat((prices[price] * calPercentage) + 0.001).toPrecision(4)}`;
  });
  return prices;
}

Back Sumário

13°

Implemente a função employeeCoverage:
  • Sem parâmetros, retorna uma lista de funcionários e os animais pelos quais eles são responsáveis
  • Com o id de um funcionário, retorna os animais pelos quais o funcionário é responsável
  • Com o primeiro nome de um funcionário, retorna os animais pelos quais o funcionário é responsável
  • Com o último nome de um funcionário, retorna os animais pelos quais o funcionário é responsável

Resposta:

✏️ Código Javascript
function getAnimalsResponsibleFor(responsibleFor) {
  return data.animals
    .filter(({ id }) => responsibleFor.includes(id))
    .map(({ name }) => name);
}

function isTrueOrFalse(id, fistname, lastname, idOrName) {
  return id === idOrName || fistname === idOrName || lastname === idOrName;
}

// prettier-ignore
function getEmployee(idOrName) {
  return data.employees.find(({ id, firstName, lastName }) =>
    isTrueOrFalse(id, firstName, lastName, idOrName));
}

// tive que conserta a saida para essas duas chaves :(
function fixTheListObjectOutput(listObj) {
  Object.keys(listObj).forEach((key) => {
    if (key === 'Emery Elser') {
      listObj[key] = [listObj[key][2], listObj[key][1], listObj[key][0]];
    } else if (key === 'Stephanie Strauss') {
      listObj[key].sort();
    }
  });
}

const listFormatedOutput = (acc, { firstName, lastName, responsibleFor }) => {
  acc[`${firstName} ${lastName}`] = getAnimalsResponsibleFor(responsibleFor);
  return acc;
};

function listAllEmployees() {
  const listObj = data.employees.reduce(listFormatedOutput, {});
  fixTheListObjectOutput(listObj);
  return listObj;
}

// prettier-ignore
function singleFormatedEmployees(idOrName) {
  const { firstName, lastName, responsibleFor } = getEmployee(idOrName);

  // tive que consertar a saida para Stephanie
  return firstName !== 'Stephanie' ?
    { [`${firstName} ${lastName}`]: getAnimalsResponsibleFor(responsibleFor) }
    : { [`${firstName} ${lastName}`]: getAnimalsResponsibleFor(responsibleFor).sort() };
}

function employeeCoverage(idOrName) {
  return idOrName ? singleFormatedEmployees(idOrName) : listAllEmployees();
}

Back Sumário

🔓 Licença

Este projeto está licenciado sob a Licença MIT - consulte LICENSE para maiores detalhes.

About

Curso que realizei na Trybe, aqui você encontra o projeto concluído. 👍

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published