2
respostas

[Dúvida] Erro

Estou recebendo a seguinte mensagem de erro no console do navegador:

Uncaught TypeError: Cannot read properties of undefined (reading 'forca')
    at script.js:72:83
    at NodeList.forEach (<anonymous>)
    at atualizaEstatisticas (script.js:71:18)
    at HTMLUnknownElement.<anonymous> (script.js:44:9)

Meu js:

const controles = document.querySelectorAll('[data-controle]');
const estatisticas = document.querySelectorAll('[data-estatistica]');

const pecas = { //array de objetos
    "bracos": {
        "forca": 29,
        "poder": 35,
        "energia": -21,
        "velocidade": -5
    },

    "blindagem": {
        "forca": 41,
        "poder": 20,
        "energia": 0,
        "velocidade": -20
    },

    "nucleos":{
        "forca": 0,
        "poder": 7,
        "energia": 48,
        "velocidade": -24
    },

    "pernas":{
        "forca": 27,
        "poder": 21,
        "energia": -32,
        "velocidade": 42
    },

    "foguetes":{
        "forca": 0,
        "poder": 28,
        "energia": 0,
        "velocidade": -2
    }
}

controles.forEach(controle => {
    controle.addEventListener("click", (evento) => {
        manipulaDados(evento.target.dataset.controle, evento.target.parentNode);
        atualizaEstatisticas(evento.target.dataset.peca);
    });
});

function zeroEsquerda(numero) {
    if (numero < 10) {
        numero = `${0}${numero}`;
    }
    return numero;
}

function manipulaDados(operacao, controle) {
    const peca = controle.querySelector("[data-contador]");
    if (operacao === "-") {
        peca.value = parseInt(peca.value) - 1;

        if (peca.value < 0) {
            peca.value = 0;
        } 

    } else {
        peca.value = parseInt(peca.value) + 1;
    }
    peca.value = zeroEsquerda(peca.value);
} 

function atualizaEstatisticas(pcEscolhida) {
    estatisticas.forEach(elemento => {
        elemento.textContent = parseInt(elemento.textContent) + pecas[pcEscolhida][elemento.dataset.estatistica]
    });
}

O que estou fazendo de errado?

2 respostas

Meu html:

<section class="robotron">
    <img class="robo" src="img/Robotron 2000 - Vermelho/Robotron 2000 - Vermelho.png" alt="Robotron" id="robotron">
    <figcaption class="titulo">ROBOTRON <br>2000</figcaption>
</section>
<section class="box estatisticas">
    <div class="estatistica">
        <p class="estatistica-titulo">Força</p>
        <div class="estatistica-valor">
            <p class="estatistica-numero" data-estatistica="forca">768</p>
        </div>
    </div>
    <div class="estatistica">
        <p class="estatistica-titulo">Poder</p>
        <div class="estatistica-valor">
            <p class="estatistica-numero" data-estatistica="poder">630</p>
        </div>
    </div>
    <div class="estatistica">
        <p class="estatistica-titulo">Energia</p>
        <div class="estatistica-valor">
            <p class="estatistica-numero" data-estatistica="energia">289</p>
        </div>
    </div>
    <div class="estatistica">
        <p class="estatistica-titulo">Velocidade</p>
        <div class="estatistica-valor">
            <p class="estatistica-numero" data-estatistica="velocidade">597</p>
        </div>
    </div>
</section>
<section class="equipamentos">
    <form action="" class="montador">
        <div class="box montador-conteudo">
            <div class="peca">
                <label for="" class="peca-titulo">Braços</label>
                <div class="controle">
                    <buttom class="controle-ajuste subtrair" data-controle="-" data-peca="bracos">-</buttom>
                    <input type="text" class="controle-contador" value="00" data-contador>
                    <buttom class="controle-ajuste somar" data-controle="+">+</buttom>
                </div>
            </div>
            <hr class="linha">
            <div class="peca">
                <label for="" class="peca-titulo">Blindagem</label>
                <div class="controle">
                    <buttom class="controle-ajuste subtrair" data-controle="-" data-peca="blindagem">-</buttom>
                    <input type="text" class="controle-contador" value="00" data-contador>
                    <buttom class="controle-ajuste somar" data-controle="+">+</buttom>
                </div>
            </div>
            <hr class="linha">
            <div class="peca">
                <label for="" class="peca-titulo">Núcleos</label>
                <div class="controle">
                    <buttom class="controle-ajuste subtrair" data-controle="-" data-peca="nucleos">-</buttom>
                    <input type="text" class="controle-contador" value="00" data-contador>
                    <buttom class="controle-ajuste somar" data-controle="+">+</buttom>
                </div>
            </div>
            <hr class="linha">
            <div class="peca">
                <label for="" class="peca-titulo">Pernas</label>
                <div class="controle">
                    <buttom class="controle-ajuste subtrair" data-controle="-" data-peca="pernas">-</buttom>
                    <input type="text" class="controle-contador" value="00" data-contador>
                    <buttom class="controle-ajuste somar" data-controle="+">+</buttom>
                </div>
            </div>
            <hr class="linha">
            <div class="peca">
                <label for="" class="peca-titulo">Foguetes</label>
                <div class="controle">
                    <buttom class="controle-ajuste subtrair" data-controle="-" data-peca="foguetes">-</buttom>
                    <input type="text" class="controle-contador" value="00" data-contador>
                    <buttom class="controle-ajuste somar" data-controle="+">+</buttom>
                </div>
            </div>
        </div>
        <input type="submit" value="Iniciar produção" class="producao" id="producao">
    </form>
</section>

Acredito que você teria que colocar o data-peca também no data-controle="+".