2014-07-10 4 views
-1

Je cherche une belle façon de faire ce qui suit, mais un gel du cerveau:Choisissez la meilleure combinaison

L'utilisateur peut ajouter (et supprimer ultérieurement) un type à un panier. Pour chaque ajout ou suppression, j'ai besoin de voir s'il y a un type supérieur dans la hiérarchie qui peut être suggéré à la place. Le type le plus élevé est préférable (note il a le même prix que le type avant-dernier mais b6 doit être préféré b5)

Exemples:

2 x type1  (100+100) -> 1 x type2 
type1 + type3 (100+300) -> 1 x type4 
type3 + type4 (300+400) -> 1 x type6 + 1 x type2 

1 type6 + 1 type2 + 1 type1 -> 1 x type6 + 1 x type3 

et ainsi de suite. Donc, si le total est 0, il suffit d'ajouter ce que l'on a cliqué sur

Sinon, vérifiez si le total plus le nouveau clic peut être résolu dans une meilleure combinaison en commençant par le haut. Si l'utilisateur refuse la suggestion, ignorez l'ajout. Code jusqu'à présent (marqué jQuery puisque le code l'utilise - carte et filtre sont les bienvenus) Je n'ai pas posté mes tentatives de recalc, puisque je veux éviter le X/Y problem.

jsFiddle

var types= { 
    b1: {price:100,quantity:0}, 
    b2: {price:200,quantity:0}, 
    b3: {price:300,quantity:0}, 
    b4: {price:400,quantity:0}, 
    b5: {price:500,quantity:0}, 
    b6: {price:500,quantity:0} 
} 
function getTotal() { 
    var total = 0; 
    $.each(types,function(typeId,type) { 
     total+=type.quantity*type.price; 
    }); 
    return total 
} 
$(function() { 
    var cont = $("#container"); 
    $.each(types,function(typeId,type) { 
     $('<button class="add" id="'+typeId+'add">Add to '+typeId+'<button><span id="'+typeId+'val">0</button><button class="remove" id="'+typeId+'remove">Remove from '+typeId+'</button><span id="'+typeId+'total">0</span><br/>').appendTo(cont); 
    }); 
    $(".add").on("click",function() { 
     var id = this.id.replace("add",""),type=types[id]; 
     type.quantity++; 
     var subTotal = type.quantity*type.price; 
     $("#"+id+"val").text(type.quantity); 
     $("#"+id+"total").text(subTotal); 
     $("#total").text(getTotal()); 
    }); 
    $(".remove").on("click",function() { 
     var id = this.id.replace("remove",""),type=types[id]; 
     if (type.quantity>0) type.quantity--; 
     var subTotal = type.quantity*type.price; 
     $("#"+id+"val").text(type.quantity); 
     $("#"+id+"total").text(subTotal); 
     $("#total").text(getTotal()); 
    }); 
}); 
+0

Donc, si un utilisateur clique deux fois sur 'ajouter b1', vous voulez que le résultat affiche 0 pour b1 et 1 pour b2? – Malk

+0

B6 et B5 ont un prix de 500 à la fois? Peut-être que b6 devrait avoir un prix de 600 (peut-être une faute de frappe de votre part)? Si non, que choisissons-nous alors? – ssBarBee

+0

Non, hélas, pas de faute de frappe. B6 préféré. – mplungjan

Répondre

2

Il est un peu déroutant ce que vous recherchez. Essayez ceci:

//Sort the keys by price descending, and get the current total 

    var remaining = getTotal(), 
     keys = Object.keys(types).sort(function(a,b){ 
      return b.price > a.price ? -1 : 1; 
     }); 


// Loop through the keys (sorted by price). 
// Set quantity based on how many times the remainder goes into the price 
// and update the remainder 

    keys.forEach(
     function(k){ 
       var x = Math.floor(remaining/types[k].price); 
       types[k].quantity = x; 
       remaining -= x * types[k].price; 
     }); 

http://jsfiddle.net/GC3mW/

+0

Merci pour l'aide! – mplungjan

+0

Donc pas de confusion - puisque votre réponse a fonctionné :) – mplungjan

1

Le problème que vous avez décrit cela semble remarquablement similaire au coins-change algorithm.

Il peut être fait de travailler avec une boucle gourmande assez simple, aller quelque part le long de ces lignes:

while(total > 0) { 
    total = total - [get largest price less than total] 
    [increment amount for above largest price] 
} 

Voici votre violon avec cette mise à jour: http://jsfiddle.net/DnRG9/1/

Cela ne gère pas tous les cas de coin Il est donc possible que j'ai raté quelque chose. Faites-moi savoir si cela aide

+0

Droite - J'ai en fait un vieux script non trivial j'ai également externalisé cela donné un certain nombre de timbres et un affranchissement calculera le meilleur ajustement. Plus utile en Hollande. Je viens de regarder et votre fonction ressemble remarquablement à mes premières tentatives. J'étais sur la bonne voie. Je vais voir si tout ce dont j'ai besoin – mplungjan

+0

vous remercie pour votre aide – mplungjan