Add values from an array with different criteria each of them

Asked

Viewed 130 times

0

0 
: 
{idPVI: “10”, idPV: “3”, descri: “Portuguesa”, preco: “32” } 
1 
: 
{idPVI: “10”, idPV: “3”, descri: “Portuguesa”, preco: “32”} 
2 
: 
{idPVI: “13”, idPV: “3”, descri: “Calabresa”, preco : “35”} 
3 
: 
{idPVI: “11”, idPV: “5”, descri: “Borda Recheada”, preco: “5”} 
4 
: 
{idPVI: “12”, idPV: “6”, descri: "GG", preco: "39,99"}

I have this array of objects on top, I want to add the values with different criteria.

For example, whatever you have idPV = x, takes the highest value of preco and what you have idPV = y, normal sum the value of preco. I’ve tried with for, forEach but I couldn’t.

I tried it like this, but it’s just adding up when it catches the same idPV and add up differently:

somaTotal(varia){
  // 1 = maior preço, 2=menor preo, 3=soma total, 4=média preco
  // console.log(varia);

  // start with 0
  let sum = 0;
  // loop over your array
  this.selectedVariation.forEach((i) => {
    if (i.idPV == varia.idPV && varia.tpCal == 1) {
      sum += Math.max(i.preco);
    }else if (i.idPV == varia.idPV && varia.tpCal == 2){
      sum += Math.min(i.preco);
    }else if (i.idPV == varia.idPV && varia.tpCal == 3){
      sum += parseInt(i.preco);
    }else if (i.idPV == varia.idPV && varia.tpCal == 4){

    }
  });

  console.log(sum);


    // this.total = total;
}

1 answer

0


Using strings where numbers should come in your JSON is not a very good idea. It’s best that the JSON numeric fields come with even numbers.

I made a code that should solve your problem. Explanations follow in the code comments.

// Função para saber se o pedido da pizza está nos conformes.
function validaPizza(pizza, itensVaria) {
    var erros = "";

    // Percorre cada uma das regras.
    for (var i in itensVaria) {
        var regra = itensVaria[i];

        // Conta quantos itens da pizza se aplicam à essa regra.
        var n = 0;
        for (var j in pizza) {
            var item = pizza[j];
            if (item.idPV === regra.idPV) n++;
        }

        // Tenta descobrir se há algum erro e se encontrar adiciona-o.
        var plural = regra.descriPlural.toLowerCase();
        var singular = regra.descriSing.toLowerCase();
        if (n === 0 && regra.eMin === 1 && regra.eMax === 1) {
            erros += " Escolha o " + singular + ".";
        } else if (n < regra.eMin && regra.eMin === 1) {
            erros += " Escolha pelo menos um " + singular + ".";
        } else if (n < regra.eMin) {
            erros += " Escolha pelo menos " + regra.eMin + " " + plural + ".";
        } else if (n > regra.eMax && regra.eMax === 1) {
            erros += " Você não pode escolher mais do que um " + singular + ".";
        } else if (n > regra.eMax) {
            erros += " Escolha no máximo " + regra.eMax + " " + plural + ".";
        }
    }
    return erros.trim();
}

// Função para calcular o preço de uma pizza.
function totalizaPreco(pizza, criterios) {
    var criterioPorIdpv = {};
    var criteriosComPrecos = [];

    // Parte 1: Monta um criterioPreco para cada criterio.
    for (var i in criterios) {
        criteriosComPrecos.push({
            tipo: criterios[i].tipo,
            idPVs: criterios[i].idPVs,
            preco: 0.0
        });
    }

    // Parte 2: Monta uma tabela de idPV para criterioPreco.
    for (var i in criteriosComPrecos) {
        var criterioPreco = criteriosComPrecos[i];
        for (var idPV in criterioPreco.idPVs) {
            criterioPorIdpv[criterioPreco.idPVs[idPV]] = criterioPreco;
        }
    }

    // Parte 3: Acessa cada item da pizza, confere o seu valor e
    // o coloca no criterioPreco correspondente.
    for (var i in pizza) {
        var item = pizza[i];
        var crit = criterioPorIdpv[item.idPV];
        if (crit.tipo === "maior") {
            var v = crit.preco;
            if (item.preco > v) crit.preco = item.preco;
        } else if (crit.tipo === "soma") {
            crit.preco += item.preco;
        } else {
            throw new Error("Tipo inválido: " + crit.tipo);
        }
    }

    // Parte 4: Percorre todos os elementos criterioPreco
    // para obter o valor final.
    var total = 0;
    for (var i in criteriosComPrecos) {
        total += criteriosComPrecos[i].preco;
    }
    return total;
}

// Critérios que definem o que deve ser calculado pela soma e o que é
// pelo maior valor.
var criterios = [
   {tipo: "maior", idPVs: [3, 6]},
   {tipo: "soma", idPVs: [5]}
];

// Critérios que definem quais são os mínimos e máximos de cada item da pizza.
// Observe que é preciso o nome tanto no plural quanto no singular para as mensagens
// ficarem corretas.
var itensVaria = [
    {
        "idPV": 3, "idD": 2, "idP": 9, "eMin": 2, "eMax": 3, "tpCal": 1,
        "descriSing": "Sabor", "descriPlural": "Sabores"
    },
    {
        "idPV": 5, "idD": 2, "idP": 9, "eMin": 0, "eMax": 1, "tpCal": 3,
        "descriSing": "Adicional", "descriPlural": "Adicionais"
    },
    {
        "idPV": 6, "idD": 2, "idP": 9, "eMin": 1, "eMax": 1, "tpCal": 3,
        "descriSing": "Tamanho", "descriPlural": "Tamanhos"
    }
];

// Função para validar uma pizza, calcular o preço e mostrar o resultado disso.
function testarPizza(pizza) {
    var r = "Pizza: ";
    var primeiro = true;
    for (var t in pizza) {
        if (primeiro) {
            primeiro = false;
        } else {
            r += ", ";
        }
        r += pizza[t].descri;
    }
    if (primeiro) r += "[nada]";
    r += ".<br>";
    var v = validaPizza(pizza, itensVaria);
    r += (v === "")
        ? "O preço é " + totalizaPreco(pizza, criterios) + "."
        : v;
    r += "<br><br>";
    document.write(r);
}

// Para ver se está tudo ok, temos aqui um monte de pizzas para avaliar e
// ver se são avaliadas corretamente.
var diversasPizzas = [
    [
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
        {idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5},
        {idPVI: 12, idPV: 6, descri: "GG", preco: 39.99}
    ],
    [
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
        {idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5}
    ],
    [], // Pizza sem informação nenhuma!
    [
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
        {idPVI: 14, idPV: 6, descri: "Tamanho normal", preco: 0}
    ],
    [
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
        {idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5},
        {idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5}
    ],
    [
        {idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
        {idPVI: 14, idPV: 6, descri: "Tamanho normal", preco: 0}
    ],
];

// Avalia cada uma das pizzas e mostra o resultado na tela.
for (p in diversasPizzas) {
    testarPizza(diversasPizzas[p]);
}

  • Got 80%......

  • @Sigautomation What’s wrong that you’d like better? I can edit the answer until it’s legal.

  • "Varia":[{"idPV":"3","idD":"2","idP":"9","descri":"Sabores","eMin":"2","eMax":"3","tpCal":"1"},{"idPV":"5","idD":"2","idP":"9","descri":"Adicionais","eMin":"0","eMax":"1","tpCal":"3"},{"idPV":"6","idD":"2","idP":"9","descri":"Tamanho","eMin":"1","eMax":"1","tpCal":"3"}]. I have this array which are product variations!

  • "ItensVaria":[{"idPVI":"10","idPV":"3","descri":"Portuguesa","preco":"32"},{"idPVI":"13","idPV":"3","descri":"Calabresa","preco":"35"},{"idPVI":"11","idPV":"5","descri":"Borda Recheada","preco":"5"},{"idPVI":"12","idPV":"6","descri":"GG","preco":"39.99"}]. And this array here are the items of each variation.

  • @Sigautomation Okay, I’m already reviewing the answer.

  • When the user makes selections of variations of the product that in the case is the pizza generates this array. (4) [{…}, {…}, {…}, {…}]&#xA;0&#xA;:&#xA;{idPVI: "10", idPV: "3", descri: "Portuguesa", preco: "32"}&#xA;1&#xA;:&#xA;{idPVI: "13", idPV: "3", descri: "Calabresa", preco: "35"}&#xA;2&#xA;:&#xA;{idPVI: "11", idPV: "5", descri: "Borda Recheada", preco: "5"}&#xA;3&#xA;:&#xA;{idPVI: "12", idPV: "6", descri: "GG", preco: "39.99"}. So when for example: an item in the array of selected variations (which is this above) has "idPV" = 3 and "tpCal" = 1 the function takes the highest value and when "tpCal" is 3 normal sum.

  • @Sigautomation I edited the answer, tell me what you think of it now. I recommend you edit your question to put additional information because reading JSON in the comments is kind of hard.

  • It was perfect @Victor Stafusa. now I wanted you to help me elsewhere! Work with angular and use an ngFor to generate the buttons "-" and "+" which are the buttons that give the user choice. So when it comes to choosing options such as the flavor of the pizza I wanted when it clicked on some flavor that "+" button would disappear.. understand ?

Show 3 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.