Explorei alguns metodos dos objetos adicionei algumas validações e como ficou um pouco grande o completo está no codepen https://codepen.io/Israel-Oliveira-Pinto/pen/azodKBO faltou espaço pro exercicio 5.
const pessoa = {
nome: "Kyler",
notas: [8, 8.75, 9.5, 10],
calcularMediaNotas: function() {
// verifica se todos os valores do array são número antes de tentar calcular, poderia ter usado o some e mudado o lugar o que executa o block if/else
// verifica se o array não é null ou undefined e verifica também se é de fato um Array.
if(this.notas && Array.isArray(this.notas) && this.notas.every(nota => typeof nota === 'number')) {
// Como um array vazio passaria pelas condições anteriores verifica se tem elementos antes de calcular a média.
if(this.notas.length === 0) {
return 'O array de notas está vazio.';
}
else {
return (this.notas.reduce((acumulador,nota) => acumulador + nota ,0) / this.notas.length).toFixed(2);
}
} else {
return 'O array contém valores que não são números.';
}
},
classificarDesempenho: function(media) {
if(media >= 9){
return 'Desempenho excelente';
} else if(media >= 7.5) {
return 'Bom desempenho';
} else if(media >= 6 ){
return 'Desempenho regular';
} else {
return'Desempenho insuficiente';
}
}
}
const media = pessoa.calcularMediaNotas()
if(media.startsWith('O array')){
console.log(media);
} else {
console.log(media);
console.log(pessoa.classificarDesempenho(parseFloat(media)));
}
const carro = {
marca: 'Volkswagen',
modelo: 'Golf GTI',
ano: 2023,
cor: 'Preto',
detalhesCarro: {}
};
for(const chave in carro) {
console.log(`A chave é ${chave} com o valor ${carro[chave]}`);
}
const detalhes = {
motor: '2.0 TSI',
potencia: 245,
torque: 370,
transmissao: 'Manual de 6 marchas',
tracao: 'Dianteira',
aceleracao: '0-100 km/h em 6,2 segundos',
velocidadeMaxima: '250 km/h',
}
carro.detalhesCarro = detalhes;
// Objetos aninhados com apenas um for in
for(const chave in carro) {
// Verifica se chegou em um objeto aninhado
if (typeof carro[chave] === 'object') {
//novo laço para pegar os atributos do elemento aninhado. Para cada detalhesCarro gerar a subChave como exemplo motor
for (const subChave in carro[chave]) {
console.log(`A chave é ${subChave} com o valor ${carro[chave][subChave]}`);
}
} else {
console.log(`A chave é ${chave} com o valor ${carro[chave]}`);
}
}
// com spread operator
const carroDetalhado = {
...carro,
...detalhes
}
// mesma funcionalidade da operação anterior só que sem lidar com objetos aninhados
for(const chave in carroDetalhado) {
console.log(`A chave é ${chave} com o valor ${carroDetalhado[chave]}`);
}
const carroHyundai = {
marca: 'Hyundai',
modelo: 'Genesis G80',
ano: 2023,
cor: 'Prata',
ligado: false,
ligar: function() { return this.ligado ? 'O carro já está ligado!' : (this.ligado = true, 'Você ligou o carro!')},
desligar: function() { return this.ligado ? (this.ligado = false, 'Delisgando o carro') : 'Carro já está desligado!'},
obterDetalhes: function(){return `A marca do carro é ${this.marca} no modelo ${this.modelo} do ano ${this.ano} na cor ${this.cor} e está ${this.ligado ? 'ligado' : 'desligado'}`}
}
console.log(carroHyundai.ligar());
console.log(carroHyundai.desligar());
console.log(carroHyundai.obterDetalhes());
// Inserindo propriedades no objeto defineProperty tem as opções necessarias para o exercicio
Object.defineProperty(carroHyundai, 'placa', {
value: 'ABC1D23',
enumerable: false,
writable: true,
configurable: true
})
for(const enumeraveis in carroHyundai) {
console.log(`A chave é ${enumeraveis} com o valor ${carroHyundai[enumeraveis]}`);
}
const chaves = Object.keys(carroHyundai);
console.log(chaves);
console.log(carroHyundai.placa);
// Outras maneiras de criar propriedades em um objeto
Object.assign(carroHyundai, { 'placa1': 'XPL8Y92' });
// Cria um prototipo de objeto que então é herdado para o carroHyundai para não herda enumerabilidade do prototipo precisa usar defineProperty diretamente no objeto para enumerar.
Object.setPrototypeOf(carroHyundai, {
placa2: 'MZQ3W84',
});