2 Stimmen

Wie man ein tiefes multidimensionales Array in ein eindimensionales Array umwandelt - Javascript

Ich habe ein riesiges mehrdimensionales Array, das ich in ein eindimensionales Array umwandeln möchte. Das eigentliche Problem ist, dass das Array dynamisch ist und so tief sein kann, wie es will, und ich im Voraus nicht sicher bin. Hier ist ein Beispiel:

    var myArray =   [
        "hallo", 
        ["Beeren", "gruppiert", 88, "gefroren"], 
        [
            "Zeug", 
            [
                "pürieren", 
                ["Melone", "einfrieren", 12, "zusammen"], 
                "Leute"
            ], 
            "Auto"
        ], 
        [
            "Orange", 
            "Code", 
            84, 
            ["Kumpel", "Frauen", "Mann"]
        ], 
        ["Bus", "Auto", 345, "Lkw"], 
        "Welt"
    ];

Es sollte in ein eindimensionales Array umgewandelt werden, wie:

["hallo","Beeren","gruppiert",88,"gefroren","Zeug","....."]

5voto

hsz Punkte 142920

Nur versuchen mit:

var flat = myArray.join().split(',');

Ausgabe:

["hello", "berries", "grouped", "88", "frozen", "stuff", "mash", "melon", "freeze", "12", "together", "people", "car", "orange", "code", "84", "mate", "women", "man", "bus", "car", "345", "lorry", "world"]

4voto

Ja͢ck Punkte 165747

Sie können eine Walker-Funktion schreiben:

function walkLeaves(arr, fn)
{
    for (var i = 0; i < arr.length; ++i) {
        if (typeof arr[i] == 'object' && arr[i].length) { // einfache Array-Überprüfung
            walkLeaves(arr[i], fn);
        } else {
            fn(arr[i], i); // nur Blätter sammeln
        }
    }
}

Und verwenden Sie dies, um das endgültige Array zu erstellen:

var final = [];
walkLeaves(arr, function(item, index) {
    final.push(item);
});

Demo

1voto

Tom Fenech Punkte 69001

Keine reine JavaScript-Lösung, aber du könntest underscore.js verwenden:

_.flatten(myArray)

...und so machen sie es:

  var flatten = function(input, shallow, output) {
    if (shallow && _.every(input, _.isArray)) {
      return concat.apply(output, input);
    }
    each(input, function(value) {
      if (_.isArray(value) || _.isArguments(value)) {
        shallow ? push.apply(output, value) : flatten(value, shallow, output);
      } else {
        output.push(value);
      }
    });
    return output;
  };

0voto

mshsayem Punkte 16853

Normale Schleife + Rekursion:

var abgeflacht = [];
function abflachen(a){
    a.forEach(function(e){
       if(toString.call(e) === "[object Array]") abflachen(e);
       else abgeflacht.push(e);
    });
}

abflachen(meinArray);

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