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)
3 Réponses :
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) }
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]))
Merci beaucoup pour cette réponse. Je vous en suis reconnaissant
Cela fonctionnera !!! P> J'ai vérifié 4 conditions ici: p>
e-mail ne doit pas être vide. p> li>
La longueur des garnitures doit être de trois. p> li>
aucun duplicates pour être là dans la matrice de résultat. P> li>
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));
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
[<>] code>
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