Add values from an array of different criteria each

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 up, I want to add the values with different criteria.

For example, whosoever has idPV = x , takes the largest value of preco and whichever has idPV = y , normal sum the value of preco . I've tried with for , forEach but could not.

I've tried this, but it's only adding up when you get the same idPV and still sum 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;
}
    
asked by anonymous 27.07.2018 / 22:09

1 answer

0

Using strings where numbers should come in your JSON is not a very cool idea. It is best if 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]);
}
    
27.07.2018 / 22:57