2016-04-26 13 views
1

Dies in Formscript zu tun.Get Alle möglichen Kombinationen von Objekten, wobei die Summe der Werte mit der Nummer übereinstimmt

Ich habe eine Reihe von Objekten, wobei jedes Objekt eine Eigenschaft rating genannt hat. Das Array sieht so aus:

var objects = [{"name":"foo","rating":4}, {"name":"bar","rating":5}, {"name":"foobar","rating":2}] 

Jetzt habe ich ein Ziel-Rating, destinationRating, das zum Beispiel: var destinationRating=11. Von diesen Objekten muss ich ein Array von etwa 20 key1;key2;key3 geformten Strings bekommen, wobei key1 und so weiter die Schlüssel aus dem Objekt-Array sind, wobei die Summe aller ausgewählten Objekte mindestens destinationRating ist. 3 ausgewählte Objekte Minimum. Ich habe keine Ahnung, wie ich einen solchen Algorithmus erstellen soll.

Das Endergebnis sollte wie folgt aussehen: [0:"0;1;2"], für den Fall, dass die ersten 3 Objekte des Arrays objects die Kriterien erfüllen.

+1

bitte einige weitere Daten und einige Beispiele hinzufügen, wie die Quelle aussehen und das gewünschte Ergebnis aussehen soll. –

+0

Worum geht es eigentlich? Möglicherweise müssen Sie Ihr tatsächliches Ziel neu bewerten und einen anderen Ansatz wählen. Mit dem angegebenen Problem wird, sobald Sie mindestens eine Kombination von Objekten erhalten haben, die den Anforderungen entsprechen, die Anzahl der Kombinationen exponentiell mit der Länge des Arrays wachsen. –

+0

Aktualisiert OP ein bisschen. Müssen nicht einmal 20 Kombinationen sein. –

Antwort

1

Dies ist ein Vorschlag, der alle Kombinationen der Indizes erzeugt (sofern sie notwendig sind, siehe Ausgabe) und prüft die gegebenen Bedingungen und gibt das gewünschte Ergebnis.

Die Ergebnismenge enthält Strings mit den Indizes der gegebenen Anordnung, die die gewünschte Summe der genannten Eigenschaft übereinstimmen.

function combination(array, property, sum) { 
 
    function c(part, i) { 
 
     var result = [], p, s; 
 
     while (i < n) { 
 
      p = part.slice(0); 
 
      p.push(i++); 
 
      document.write(p + '<br>'); 
 
      s = p.reduce(function (r, a) { return r + array[a][property]; }, 0); 
 
      if (s < sum) { 
 
       result = result.concat(c(p, i)); 
 
      } 
 
      if (p.length >= 3 && s === sum) { 
 
       result.push(p.join(';')); 
 
       break; 
 
      } 
 
     } 
 
     return result; 
 
    } 
 

 
    var n = array.length; 
 
    return c([], 0); 
 
} 
 

 
var objects = [{ "name": "id0", "rating": 4 }, { "name": "id1", "rating": 5 }, { "name": "id2", "rating": 2 }, { "name": "id3", "rating": 6 }, { "name": "id4", "rating": 8 }, { "name": "id5", "rating": 3 }, { "name": "id6", "rating": 1 }]; 
 

 
document.write('<pre>' + JSON.stringify(combination(objects, 'rating', 11), 0, 4) + '</pre>');

+0

Seltsamerweise, für einen Datensatz, der groß genug ist, um ihn zu kombinieren, werden Kombinationen für Summe 6 und darunter leer ... Schließen Sie genau die Summe ab? Kann darüber hinausgehen, nur dass 3 Elemente maximal sind ... –

+0

brauchst du nur 3 Elemente? Ändere 'if (p.length> = 3 && s === Summe)' nach 'if (p.length === 3 && s === Summe)' oder überspringe die Längenprüfung. –

+0

Ich implementiere das jetzt für den endgültigen Gebrauch und ich sehe einige Dinge, auf die ich ein paar Ratschläge verwenden könnte. Wenn 'sum' zu klein ist, um mit 3 Elementen zusammengesetzt zu werden, gibt es mir keine Kombinationen. In diesem Fall würde ich mir wünschen, dass es zumindest einige Kombinationen gibt, die "Summe" überschwingen. Wie bearbeite ich das, um das zu erreichen? Limit ist immer noch 3 Elemente. Wenn das nicht möglich ist, kann ich allerdings umgehen. –

Verwandte Themen