2016-06-13 14 views
1

Ich versuche, eine rekursive Funktion zum Erstellen eines Arrays in der Hälfte Spleiß, bis er nur Längen von 3 und 2, als alle diese fein säuberlich in einem Array platziert neue Arrays zu haben.JavaScript Array der Division

Ich glaube, ich brauche eine Möglichkeit zu messen, wie viele Arrays ich brauche, sie erstellen und sie dann in meiner aufgeteilt Arrays werfen? (Ich dachte Pow?).

Ich benutze halb und Runde, wie ich auf dem Papier experimentiert habe und das bedeutet, dass ich mit 2 und 3 enden werde, anstatt durch 3 zu teilen, da es manchmal einen Rest von 1 gibt (und ich plane es Verwenden Sie dasselbe Skript, um später mit diesen Daten eine Triangulation zu erstellen.

Aktuelle Code, (unvollständig, denn dies funktioniert, wenn Aussagen zusätzliche fortzusetzen hat erstellen).

var pointlist = []; 
 
var pointCount = 666; 
 

 
var generate = function(t, n) { 
 
    for (count = 0; count < n; count++) { 
 
    var point = { 
 
     x: (Math.random() * 1000), 
 
     y: (Math.random() * 1000) 
 
    }; 
 

 
    t.push(point); 
 
    } 
 
} 
 

 
generate(pointlist, pointCount); 
 
var divisions = []; 
 
var divide = function(a) { 
 
    a.sort(function(a, b) { 
 
    return a.x - b.x 
 
    }); 
 
    if (a.length > 3) { 
 
    b = a.splice(Math.round(a.length/2), a.length); 
 
    divisions.push(a, b); 
 
    if (a.length > 3) { 
 
     c = a.splice(Math.round(a.length/2), a.length); 
 
     d = b.splice(Math.round(b.length/2), b.length); 
 
     divisions = []; 
 
     divisions.push(a, c, b, d); 
 
     if (a.length > 3) { 
 
     e = a.splice(Math.round(a.length/2), a.length); 
 
     f = c.splice(Math.round(c.length/2), c.length); 
 
     g = b.splice(Math.round(b.length/2), b.length); 
 
     h = d.splice(Math.round(d.length/2), d.length); 
 
     divisions = []; 
 
     divisions.push(a, e, c, f, b, g, d, g); 
 
     } 
 
    } 
 
    } 
 
}; 
 
divide(pointlist); 
 
console.log(divisions.length + " arrays"); 
 
console.log(divisions[0].length + " first length"); 
 
console.log(divisions[1].length + " second length");

+1

Was ist der Eingang und Ausgang sind Sie nach? (nicht der Algorithmus, Berechnung und so weiter, die Arrays, die Sie spleißen möchten) – Amit

+0

Ich möchte Punktliste Array spleißen und fügen Sie sie in die Divisionen Array, halten sie in der Reihenfolge von der Sortierfunktion erstellt. – Chris

+1

Spezifische und genaue Eingabe und Ausgabe Proben bitte, Beschreibung ist nicht hilfreich. – Amit

Antwort

1

Hier ist eine rekursive Funktion, die Sortierung ohne die nur einmal passieren sollte:

var pointlist = []; 
 
var pointCount = 666; 
 

 
var generate = function(t, n) { 
 
    for (count = 0; count < n; count++) { 
 
    var point = { 
 
     x: Math.floor(Math.random() * 1000), 
 
     y: Math.floor(Math.random() * 1000) 
 
    }; 
 

 
    t.push(point); 
 
    } 
 
} 
 

 
generate(pointlist, pointCount); 
 

 
var divide = function(a) { 
 
    a.sort(function(a, b) { 
 
    return a.x - b.x 
 
    }); 
 
    function recurseDivide(a) { 
 
    if (a.length <= 3) return [a]; 
 
    var b = a.splice(Math.round(a.length/2), a.length); 
 
    return recurseDivide(a).concat(recurseDivide(b)); 
 
    } 
 
    return recurseDivide(a); 
 
}; 
 
var divisions = divide(pointlist); 
 
console.log(divisions.length + " arrays"); 
 
console.log(divisions[0].length + " first length"); 
 
console.log(divisions[1].length + " second length");</script>

Beachten Sie, dass nach dem Aufruf von divide, die Variable pointlist wird mut ated. Wenn Sie dies vermeiden wollen, machen den Aufruf wie folgt:

var divisions = divide(pointlist.slice()); 
+0

Das ist schön, danke für Ihre Hilfe! – Chris

0

nicht rekursiv, sondern mit Hilfe eines nutzlosen Array-Methode Array.prototype.bisect() genannt sein kann man etwas tun kann wie folgt;

Array.prototype.bisect = function(){ 
 
    var atIndex = Math.round(this.length/2); 
 
    return [this.slice(0,atIndex),this.slice(atIndex)]; 
 
}; 
 
var arr = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19], 
 
    brr = []; 
 
function breakUp(arr){ 
 
    while (arr[0].length > 3) arr = [].concat(...arr.map(a => a.length > 3 && a.bisect())); 
 
    return arr; 
 
} 
 
brr = breakUp([arr]); 
 
console.log(JSON.stringify(brr));

+0

Das ist eine nette Art, es zu tun, danke! – Chris