“Não há satisfação maior do que aquela que sentimos quando proporcionamos alegria aos outros - M. Taniguchi”
Sobre o projeto | Entrega | Licença
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.
-
📌 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
- 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
✏️ Código Javascript
function animalsByIds(...ids) {
// seu código aqui
return data.animals.filter(({ id }) => ids.includes(id));
}
- 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
✏️ Código Javascript
function animalsOlderThan(animal, age) {
// seu código aqui
return data.animals
.find(({ name }) => name === animal)
.residents.every(({ age: ageRes }) => ageRes >= age);
}
- 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
✏️ Código Javascript
function employeeByName(employeeName) {
return (
data.employees.find(
({ firstName, lastName }) => employeeName === firstName || employeeName === lastName) || {}
);
}
- Cria um novo colaborador a partir de objetos contendo
informações pessoais
egerentes e animais gerenciados
.
✏️ Código Javascript
function createEmployee(personalInfo, associatedWith) {
// seu código aqui
return {
...personalInfo,
...associatedWith,
};
}
- Testa se o id passado é de um gerente
✏️ Código Javascript
function isManager(id) {
return data.employees.some(({ managers }) => managers.some(idManage => id === idManage));
}
- Adiciona um funcionário no fim da lista
✏️ Código Javascript
function addEmployee(id, firstName, lastName, managers = [], responsibleFor = []) {
data.employees.push({ id, firstName, lastName, managers, responsibleFor });
}
- Sem parâmetros, retorna animais e suas quantidades
- Com o nome de uma espécie de animal, retorna somente a quantidade
✏️ 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;
}
- 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
✏️ 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;
}
- 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'
ousex: 'male'
especificada, retorna somente nomes de animais macho/fêmea - Com a opção
sex: 'female'
ousex: 'male'
especificada e a opçãosort: 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
✏️ 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);
}
- 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
✏️ 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;
}
- 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
✏️ 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]);
}
- Ao passar uma porcentagem, incrementa todos os preços, arrendondados em duas casas decimais
✏️ 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;
}
- 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
✏️ 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();
}
Este projeto está licenciado sob a Licença MIT - consulte LICENSE para maiores detalhes.