1046 Stimmen

Array in Stücke aufteilen

Nehmen wir an, dass ich ein Javascript-Array habe, das wie folgt aussieht:

["Element 1","Element 2","Element 3",...]; // with close to a hundred elements.

Welcher Ansatz wäre angemessen, um das Array in viele kleinere Arrays mit, sagen wir, höchstens 10 Elementen aufzuteilen?

8voto

Rein F Punkte 308

Hier ist ein Beispiel, in dem ich ein Array in Stücke von 2 Elementen aufteile, indem ich einfach Stücke aus dem Array herausschneide, bis das ursprüngliche Array leer ist.

    const array = [86,133,87,133,88,133,89,133,90,133];
    const new_array = [];

    const chunksize = 2;
    while (array.length) {
        const chunk = array.splice(0,chunksize);
        new_array.push(chunk);
    }

    console.log(new_array)

8voto

metakungfu Punkte 6903

Die eine Zeile in reinem Javascript:

function chunks(array, size) {
  return Array.apply(0,{length: Math.ceil(array.length / size)}).map((_, index) => array.slice(index*size, (index+1)*size))
}

// The following will group letters of the alphabet by 4
console.log(chunks([...Array(26)].map((x,i)=>String.fromCharCode(i + 97)), 4))

8voto

Jon Punkte 2573
results = []
chunk_size = 10
while(array.length > 0){
   results.push(array.splice(0, chunk_size))
}

8voto

Ayaz Punkte 2041

Sie können die Funktion Array.prototype.reduce verwenden, um dies in einer Zeile zu tun.

let arr = [1,2,3,4];
function chunk(arr, size)
{
    let result = arr.reduce((rows, key, index) => (index % size == 0 ? rows.push([key]) : rows[rows.length-1].push(key)) && rows, []);
    return result;
}

console.log(chunk(arr,2));

7voto

Redu Punkte 22159

Und das wäre mein Beitrag zu diesem Thema. Ich denke .reduce() ist der beste Weg.

var segment = (arr, n) => arr.reduce((r,e,i) => i%n ? (r[r.length-1].push(e), r)
                                                    : (r.push([e]), r), []),
        arr = Array.from({length: 31}).map((_,i) => i+1);
        res = segment(arr,7);
console.log(JSON.stringify(res));

Die obige Implementierung ist jedoch nicht sehr effizient, da .reduce() läuft durch alle arr Funktion. Ein effizienterer Ansatz (sehr nahe an der schnellsten imperativen Lösung) wäre, über das reduzierte (zu chunkende) Array zu iterieren, da wir seine Größe im Voraus berechnen können durch Math.ceil(arr/n); . Sobald wir das leere Ergebnis-Array haben, wie Array(Math.ceil(arr.length/n)).fill(); der Rest ist die Abbildung von Abschnitten des arr Array hinein.

function chunk(arr,n){
  var r = Array(Math.ceil(arr.length/n)).fill();
  return r.map((e,i) => arr.slice(i*n, i*n+n));
}

arr = Array.from({length: 31},(_,i) => i+1);
res = chunk(arr,7);
console.log(JSON.stringify(res));

So weit so gut, aber wir können den obigen Ausschnitt noch weiter vereinfachen.

var chunk = (a,n) => Array.from({length: Math.ceil(a.length/n)}, (_,i) => a.slice(i*n, i*n+n)),
    arr   = Array.from({length: 31},(_,i) => i+1),
    res   = chunk(arr,7);

console.log(JSON.stringify(res));

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