25 Stimmen

Partitionierung in JavaScript

Betrachten Sie bitte ein Array wie z.B. :

arrayAll = [1,2,3,4,5,6,7,8,9]

Gibt es ein Paket, mit dem man eine Partitionierung durchführen kann, um eine :

arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]]

Ich kann sehen, wie man dies mit einer for-Schleife tun, aber würde eine "vorgefertigte" Funktion zu schätzen wissen, wenn vorhanden.

26voto

Ich denke, Sie werden eine for-Schleife verwenden müssen, ich kenne keine eingebauten Funktionen...

Versuchen Sie diese Funktion:

function splitarray(input, spacing)
{
    var output = [];

    for (var i = 0; i < input.length; i += spacing)
    {
        output[output.length] = input.slice(i, i + spacing);
    }

    return output;
}

20voto

Hier ist eine rekursive Lösung:

function partition(array, n) {
  return array.length ? [array.splice(0, n)].concat(partition(array, n)) : [];
}    

Dabei wird die Tatsache ausgenutzt, dass Array#splice entfernt die angegebenen Elemente destruktiv und gibt sie als Funktionswert zurück. Beachten Sie, dass dadurch das Eingabefeld zerstört wird und leer bleibt .

13voto

millimoose Punkte 37843

Bei Verwendung von Underscore.js können Sie dies umsetzen mit groupBy() y values()

function partition(items, size) {
    var result = _.groupBy(items, function(item, i) {
        return Math.floor(i/size);
    });
    return _.values(result);
}

(Dies ist weniger hässlich in CoffeeScript .)

jsFiddle: http://jsfiddle.net/MW3BS/

6voto

Ross Punkte 13790

Ich habe diese Lösung hinzugefügt zu @dystroys jspref hier und es erscheint doppelt so schnell laufen wie die anderen Lösungen. Bearbeiten: in Safari und Chrome, aber nicht in Firefox

Hier ist eine funktionelle Lösung, um die Mischung der Antworten hier zu ergänzen.

Es handelt sich um eine Funktion höherer Ordnung namens toPartitions die einen Callback für die reduce-Methode von underscore oder die native array reduce-Methode zurückgibt.

Beispiel für die Verwendung:

[1,2,3,4,5,6,7,8,9].reduce( toPartitions( 3 ), [] );

Die Funktion:

function toPartitions ( size ) {
    var partition = [];
    return function ( acc, v ) {
        partition.push( v );
        if ( partition.length === size ) {
            acc.push( partition );
            partition = [];
        }
        return acc;
    };
}

Wie Clojure's Partition wird keine Endpartition eingefügt, wenn nicht genügend Elemente vorhanden sind.

In Ihrem Beispiel könnten Sie das tun:

arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) );

Wenn Sie dies nicht mit reduce aber eine Funktion, die ein Array und die Größe der Partition annimmt, könnte ausreichen:

function partition ( arr, size ) {
    return arr.reduce( toPartitions( size ), [] );
}

Die Lösung wäre also einfach:

arrayALLPartionned = partition( arrayAll, 3 );

4voto

Denys Séguret Punkte 355205

Eine weitere Lösung, die keine externe Bibliothek benötigt:

function partition(items, size) {
    var p = [];
    for (var i=Math.floor(items.length/size); i-->0; ) {
        p[i]=items.slice(i*size, (i+1)*size);
    }
    return p;
}

Demonstration : http://jsfiddle.net/dystroy/xtHXZ/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X