0
votes

JavaScript - Trouver des pizzas gagnant de Json

Tout client qui commande une pizza à trois garnissures avec une combinaison unique de Les garnitures à travers toutes les pizzas dans tous les magasins pour ce mois recevront un coupon pour une pizza gratuite par courrier électronique (s'ils fournissent leur adresse électronique).

Voici deux méthodes pour trouver le gagnant. Mais aucune de ces méthodes ne fonctionne correctement. Je ne suis pas sûr où se trouve le bug. Aussi quel ensemble de données dois-je utiliser pour tester ces implémentations? Comment puis-je résoudre ce problème avec les requêtes de la base de données? p>

p>

// Here is the json array and functions:
const inputArray = [{"email": "email1@example.com", "toppings":
    ["Mushrooms","Pepperoni","Peppers"]},
    {"email": "email2@example.com", "toppings":
    ["Cheddar","Garlic","Oregano"]},
    {"email": "email3@example.com", "toppings": ["Bacon","Ham","Pineapple"]},
    {"email": "", "toppings": ["Parmesan","Tomatoes"]},
    {"email": "email4@example.com", "toppings":
    ["Mushrooms","Pepperoni","Peppers"]},
    {"email": "", "toppings": ["Cheddar","Tomatoes"]},
    {"email": "email5@example.com", "toppings": ["Bacon","Ham","Pineapple"]},
    {"email": "email6@example.com", "toppings": ["Beef","Parmesan"]},
    {"email": "", "toppings": ["Onions","Pepperoni"]},
    {"email": "", "toppings": ["Bacon","Ham","Pineapple"]}]


function printWinners1(inputArray) {
  // Perform a QuickSort on the array.
  inputArray.sort((a, b) => {
    // Convert each toppings array to a string and do a string comparison
    return a.toppings.toString().localeCompare(b.toppings.toString());
  });
  let previousEmail = '';
  let previousToppingsAsString = '';
  let previousToppingCount = 0;
  let numberOfSimilarOrders = 0;
  // Iterate through the array, with "order" being each item in the  array.
  inputArray.map((order) => {
    let toppingsAsString = order.toppings.toString();
    if (toppingsAsString === previousToppingsAsString) {
      numberOfSimilarOrders++;
    } else {
      if ((numberOfSimilarOrders === 1) && 
          (previousToppingCount === 3) && 
          (previousEmail) !== '') {
        // Print out the email.
        console.log(previousEmail);
      }
      previousToppingsAsString = toppingsAsString;
      previousEmail = order.email;
      previousToppingCount = order.toppings.length;
      numberOfSimilarOrders = 1;
    }
  });
}

function printWinners2(inputArray) {
  let hashTable = new Map();
  // Iterate through the array, with "order" being each item in the array.
  inputArray.map((order) => {
    if ((order.toppings.length === 3) && (order.email !== '')) {
      let toppingsAsString = order.toppings.toString();
      let matchingValue = hashTable.get(toppingsAsString);
      if (matchingValue) {
        // This key was already in the hash table.
        // matchingValue is a reference to the object in the hash table.
        matchingValue.duplicate = true;
      } else {
        // Insert into the hash table, using the toppings as the           key and an object containing the email as the value.
        hashTable.set(toppingsAsString, {
          email: order.email,
          duplicate: false
        });
      }
    }
  });
  // Iterate through the values in the hash table, with "value" being each value.
  hashTable.forEach((value) => {
    if (!value.duplicate) {
      // Print out the email.
      console.log(value.email);
    }
  });
}
printWinners1(inputArray)


4 commentaires

Vous posez des questions sur les requêtes de base de données .. Quel type de base de données utilisez-vous? Aussi quels sont les critères exacts pour gagner? Il suffit de commander et a aussi un email sur dossier?


Qui est le gagnant ici? Veuillez fournir quelques informations supplémentaires sur la manière de calculer le gagnant, peut être avec une sortie attendue.


J'ai fait un extrait pour vous. La prochaine fois, essayez de formater le code dans un extrait [<>]


Je souhaite charger ces données JSON et imprimer les adresses électroniques de tous les gagnants. (Pour l'exemple ci-dessus, il imprimerait de courrier électronique2@example.com.) Raison: il s'agit du gagnant car il a sélectionné 3 garnitures cheddar "," Garlic "," Orégano est unique parmi tous les autres garnitures et il a fourni son adresse e-mail et pas moins de 3 garnitures


3 Réponses :


0
votes

Je suis en train de jouer avec elle maintenant sur Jsfiddle pour voir si je peux faire quelque chose obtenir vos résultats. La première chose qui saute sur moi est que vous avez ci-dessous:

function printWinners(){

// filter array down to email addresses and 3 topping pizza's
  let onlyEmails = orders.filter(order => order.email && order.toppings.length === 3)

// change orders to have sorted toppings and add a place to track similar order, then sort the entire list by order toppings
  let toppingsAsStrings = onlyEmails.map(order => {
    return {
      email: order.email,
      toppings: order.toppings.sort().toString(),
      similarOrders: 0,
    }
  }).sort((a, b) => {
    if (a.toppings.toLowerCase() < b.toppings.toLowerCase()) {
      return -1
    } else if (a.toppings.toLowerCase() > b.toppings.toLowerCase()) {
      return 1
    } else {
      return 0
    }
  })

  // check each order against it neighbors marking it if two of them match
 for (let i = 0; i < toppingsAsStrings.length; i++){
    if (i == 0) {
      toppingsAsStrings[i].toppings === toppingsAsStrings[i + 1].toppings ? toppingsAsStrings[i].similarOrders = 1 : null
    } else if (i == toppingsAsStrings.length - 1) {
      toppingsAsStrings[i].toppings === toppingsAsStrings[i - 1].toppings ? toppingsAsStrings[i].similarOrders = 1 : null
    } else {
      toppingsAsStrings[i].toppings === toppingsAsStrings[i + 1].toppings ||
        toppingsAsStrings[i].toppings === toppingsAsStrings[i - 1].toppings ?
        toppingsAsStrings[i].similarOrders = 1 :
        null
    }
  }

//find the ones that did not have matches
  let winners = toppingsAsStrings.filter(order => !order.similarOrders)

  console.log(winners)
}


0 commentaires

0
votes

Voici mon emporter sur elle.

Je passe dans votre liste de commandes et réorganise-la dans un objet ("hachage") selon les triplets de garniture choisis. Les garnitures sont triées pour faire la commande dans laquelle ils sont mentionnés sans importance. P>

Je les filtre à nouveau pour vérifier leur unicité. La sortie est une matrice de tableaux: chaque sous-tableau contient la combinaison de garniture suivie d'un émettrice à un élément de courriels des gagnants. P>

p>

const inputArray = [{"email": "email1@example.com", "toppings":
["Mushrooms","Pepperoni","Peppers"]},
{"email": "email2@example.com", "toppings":
["Cheddar","Garlic","Oregano"]},
{"email": "email3@example.com", "toppings": ["Bacon","Ham","Pineapple"]},
{"email": "", "toppings": ["Parmesan","Tomatoes"]},
{"email": "email4@example.com", "toppings":
["Mushrooms","Pepperoni","Peppers"]},
{"email": "", "toppings": ["Cheddar","Tomatoes"]},
{"email": "email5@example.com", "toppings": ["Bacon","Ham","Pineapple"]},
{"email": "email6@example.com", "toppings": ["Beef","Parmesan"]},
{"email": "", "toppings": ["Onions","Pepperoni"]},
{"email": "", "toppings": ["Bacon","Ham","Pineapple"]}];

var win=Object.entries(inputArray.reduce((a,c)=>{
  if (c.toppings.length==3){
let top=c.toppings.sort().join('_');
if (c.email) (a[top]=a[top]||[]).push(c.email);
  }
  return a;
}, {})).filter(([t,m])=>m.length==1);

console.log(win);
// The actual list of winners is extracted like this:
console.log(win.map(c=>c[1][0]))


1 commentaires

Merci beaucoup pour cette réponse. Je vous en suis reconnaissant



0
votes

Cela fonctionnera !!! P> J'ai vérifié 4 conditions ici: p>

  1. e-mail ne doit pas être vide. p> li>

  2. La longueur des garnitures doit être de trois. p> li>

  3. aucun duplicates pour être là dans la matrice de résultat. P> li>

  4. Vérification unique pour les garnitures p> li> ol>

    p>

    var inputArray = [{"email": "email1@example.com", "toppings":
        ["Mushrooms","Pepperoni","Peppers"]},
        {"email": "email2@example.com", "toppings":
        ["Cheddar","Garlic","Oregano"]},
        {"email": "email3@example.com", "toppings": ["Bacon","Ham","Pineapple"]},
        {"email": "", "toppings": ["Parmesan","Tomatoes"]},
        {"email": "email4@example.com", "toppings":
        ["Mushrooms","Pepperoni","Peppers"]},
        {"email": "", "toppings": ["Cheddar","Tomatoes"]},
        {"email": "email5@example.com", "toppings": ["Bacon","Ham","Pineapple"]},
        {"email": "email6@example.com", "toppings": ["Beef","Parmesan"]},
        {"email": "", "toppings": ["Onions","Pepperoni"]},
        {"email": "", "toppings": ["Bacon","Ham","Pineapple"]}];
    
    function printWinners(inputArr) {
        var res = [];
        for(var i= 0; i<inputArr.length; i++) {
            if(inputArr[i]['email'] !== '' && inputArr[i]['toppings'].length === 3 && !res.find(item => item['email'] === inputArr[i]['email']) && (new Set(inputArr)).size === inputArr.length) {
                res.push(inputArr[i]);
          }
    
        }
        return res;
    }
    
    console.log(printWinners(inputArray));


0 commentaires