JS nested array länge ermitteln

D0bby

Cadet 3rd Year
Registriert
Aug. 2023
Beiträge
55
Moin,

ich häng aktuell wieder an einer Aufgabe und bräuchte mal einen Tipp wie ich es lösen könnte.

Aktuell versuche ich mich an "for" schleifen und mit diesen über ein array zu gehen. 2D auch klein Problem - pack ich aber eine weitere Liste unter ein Item komm ich nicht weiter.

Der Weißkohl und co. bringen mich zum verzweifeln.
Ich laufe als erstes das Grundgerüst ab und bekomme 3 - dann kann ich auch noch ohne Probleme in die einzelnen Arrays rein und bekomme ; 0 1 2 ; 0 1 2 ; 0 1 2;

Soweit so gut - jetzt versuche ich aber die tiefe der einzelnen Ebenen abzufragen und da hänge ich. Da kommt dann einfach ∞1 464.

Für jeden Tipp bin ich sehr dankbar :) <3

Javascript:
let waren = [
    [
        "Äpfel",
        "Birnen",
        "Bananen"
    ],
    [
        "Möhren",
        "Sellerie",
        [
            "Weißkohl",
            "Rotkohl",
            "Grünkohl"
        ]
    ],
    [
        "Graubrot",
        "Schwarzbrot",
        "Vollkornbrot"
    ]
];
 
Würde ich tbh rekursiv lösen und so durch den Baum gehen
 
  • Gefällt mir
Reaktionen: D0bby
Wie soll denn das Ergebnis aussehen?

Ich kann mir hier nicht vorstellen, was mit Tiefe gemeint ist.

So in die Richtung?

JSON:
{
    arr1: 0,
    arr2: 1,
    arr3: 0
}

oder willst du einfach alle Elemente über alle Arrays hinweg zählen? Bspw. so:

Javascript:
const waren = [
    [
        "Äpfel",
        "Birnen",
        "Bananen"
    ],
    [
        "Möhren",
        "Sellerie",
        [
            "Weißkohl",
            "Rotkohl",
            "Grünkohl"
        ]
    ],
    [
        "Graubrot",
        "Schwarzbrot",
        "Vollkornbrot"
    ]
];

function flatArr(sum, el) {
  if (Array.isArray(el)) {
    return el.reduce(flatArr, sum);
  }
  return [...sum, el];
}

result = waren.reduce(flatArr, []);

console.log(result.length)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: D0bby
@blablub1212 Warum muss immer von einem eine konkrete Lösung gegeben werden? Jetzt ist der Lerneffekt durchs Lösung selbst erarbeiten für den TE im Eimer. Spitze!
 
  • Gefällt mir
Reaktionen: joshim, D0bby und TorenAltair
Alles cool ;) Das war nicht meine Idee.

Ich soll eher das Array durch gehen, und alle einzelnen Parts im log ausgeben.
Mit Tiefe meinte ich - Die Liste ist ja verschachtelt. In der ersten Ebenen sitzen die 3 Haupt Listen.
Dann geht's weiter in die einzelnen Parts in der 2. Ebene - Nur das bei der 2. Liste eine weitere Verschachtelung kommt.

Bei nur 2 Ebenen würde ich das ja einfach mit - - ausgeben.
Code:
for (let i = 0; i < waren.length; i++) {
    
    for (let x = 0; x < waren[i].length; x++) {
        console.log(waren[i][x]);
    }
}

Nur die dritte ebene macht mir Kopfschmerzen. Wodrauf ich schon gekommen bin, ist dies noch mit einem If Else zu verknüpfen ( if (typeof waren[x] != "string") ) - ABER wenn meine Liste jetzt noch mengen angaben hätte, bekomm ich ja wieder ein Problem, wenn diese als integer in dieser stehen.



Rekursion bin ich gerade am googlen. Hatte ich jetzt so noch nicht im Kurs - daher sagt mir das noch nicht so viel :)
 
@DaysShadow eine konkrete Lösung wäre über die Verwendung von "for" gegeben ;) Ein blutiger Anfänger wird sich mit dem Konzept hinter "reduce" durchaus schwer tun.

@D0bby
Das Problem kannst du nur mittels Rekursion sinnvoll lösen. Dafür musst du eine Funktion anlegen, die sich bei bestimmten Bedingungen selber aufruft. Wenn du das über geschachtelte for-Schleifen lösen willst, dann musst du je nach Tiefe eine weitere Schleife einbauen.

Da für dich nur die Unterscheidung zwischen Element oder Array relevant ist, solltest du nicht auf einen String prüfen, sondern eben auf ein Array.
 
  • Gefällt mir
Reaktionen: D0bby
Ich bekomm es nicht hin. Evtl fehlt mir da noch was.

Alles was ich finde mit Rekursion und Array ist eher der Ansatz die Verschachtelung zu flatten.
Evtl mach ich mir da aktuell auch zu sehr einen Kopf drüber - aber es nicht zu wissen wie es geht nervt extrem ;)

Hat wer eine Lösung für mich, damit ich rückwärts lernen kann?
 
D0bby schrieb:
Alles was ich finde mit Rekursion und Array
Sollst ja auch nicht stumpf im Internet nach einer Lösung suchen, sondern dir Gedanken machen. Nimm dir ein Stück Papier und schreib auf was du in welchem Fall machen musst und spiels im Kopf oder auf Papier für bestimmte Eingaben durch.

D0bby schrieb:
Evtl mach ich mir da aktuell auch zu sehr einen Kopf drüber
Dann mach Pause, irgendwann macht der Kopf auch nicht mehr mit und muss mal geleert werden.

Die Lösung solltest du aber mit dem hier gezeigten bereits hinbekommen. Dir wurde gezeigt wie du auf ein Array prüfst und wie eine Rekursion geht ebenso, falls du das auch noch nicht kennst.

Wofür machst du das denn eigentlich?
 
Naja ich bin gerade am Anfang eines Kurses - bei diesem kam nur das normale Array ohne Verschachtelung zum durchlaufen dran. Am ende des Kurses wurde aber auf die Verschachtelten hingewiesen und wer lust hat zu Knobeln könne dies probieren.

Im Kurs Forum wurde dies dann simpel über die abfrage "string" gemacht - was aber wieder mit einer Zahl nicht klappt.

Hab jetzt aber nach zig mal testen eine Lösung evtl für mich gefunden. Das mit den Rekursionen hatte ich noch nicht. Würde mich aber interessieren, wie da die Lösung aussehen würde. Wahrscheinlich nicht so ein Mess wie bei mir :p

Javascript:
"use strict";

"use strict";

let waren = [
    [
        "Äpfel",
        "Birnen",
        "Bananen",
        "Mangos"
    ],
    [
        2,
        "Möhren",
        "Sellerie",
        "Kohl",
        "Blumenkohl",
        "Rosenkohl"
    ],
    [
        [
            2,
            "Graubrot",
            "Schwarzbrot",
            "Vollkornbrot"
        ],
        [
            "Dinkelbrötchen",
            "Roggenbrötchen",
            "Vollkornbrötchen"
        ]
    ]
];

for (let i = 0; i < waren.length; i++) {
    if (Array.isArray) {
       
        for (let x = 0; x < waren[i].length; x++) {
            if (Array.isArray(waren[i])) {
                if (Array.isArray(waren[i][x]) == false) {
                    console.log(waren[i][x]);
                }
            } for (let y = 0; y < waren[i][x].length; y++) {
                if (Array.isArray(waren[i][x])) {
                    if (Array.isArray(waren[i][x][y]) == false) {
                        console.log(waren[i][x][y]);
                    }
                }
                   
            }
        }
    }
}
 
Und für die 4. Ebene fügst du jetzt noch eine Schleife hinzu? :p

Man sagt beim Programmieren, wenn etwas für n=1 und n=2 funktioniert, in deinem Fall ist n die Anzahl an Verschachtelungen, dann kann man es auch direkt so programmieren, dass es für ein beliebiges n funktioniert (Performance erstmal außen vor). Man möge mich korrigieren, falls falsch formuliert! ;)

D0bby schrieb:
über die abfrage "string" gemacht - was aber wieder mit einer Zahl nicht klappt
Ja, ist ja auch Quatsch auf String zu prüfen. Dich interessiert ja an sich erstmal nicht, welchen Typ das Element in dem Array hat außer es ist ein Array, weil du dann nochmal darin suchen musst. Daher der Test, ob ein Element ein Array ist.
 
  • Gefällt mir
Reaktionen: D0bby
Ich weiß - elegant ist anders und wiederholender Code… Aber erst mal bin ich froh das ich es jetzt mit der Logik hinbekommen habe und morgen gucke ich Evtl noch mal drauf, ob ich es als Funktion lösen kann. :)
 
Javascript:
"use strict";

"use strict";

let waren_2 = [];
let waren = [
    [
        "Äpfel",
        "Birnen",
        "Bananen",
        "Mangos"
    ],
    [
        2,
        "Möhren",
        "Sellerie",
        "Kohl",
        "Blumenkohl",
        "Rosenkohl"
    ],
    [
        [
            2,
            "Graubrot",
            "Schwarzbrot",
            "Vollkornbrot"
        ],
        [
            "Dinkelbrötchen",
            "Roggenbrötchen",
            "Vollkornbrötchen"
        ]
    ]
];

function print_arr (ar) {
    for (let elem of ar) {
        if (typeof(elem) == "object") {
            print_arr(elem);
        } else {
            waren_2.push(elem);
        }
    }
};

print_arr(waren);

console.log(waren_2);
 
Bitte korrigiert mich, wenn ich falsch liege, aber ich würde der Funktion definitiv einen "sinnvolleren" Namen geben.
iterateArray z.b.
 
  • Gefällt mir
Reaktionen: D0bby
Da hast du recht - mir fallen da nur nicht immer so gute Namen ein. Muss ich mich mal mehr mit beschäftigen :daumen:

Hatte jetzt noch eine zweite Lösung mit forEach - die hab ich jetzt erst kennen gelernt.

Javascript:
const iterateArray = function(a) {
    a.forEach(element => {
        if (typeof(element) == "object") {
            iterateArray(element);
        } else {
            console.log(element);
        }
    });
}

iterateArray(waren);
 
D0bby schrieb:
Da hast du recht - mir fallen da nur nicht immer so gute Namen ein. Muss ich mich mal mehr mit beschäftigen :daumen:
Ich bin komplett bei dir, mir fällt das auch manchmal recht schwer, obwohl iterateArray ja auch nicht 100% korrekt ist, weil du ja eine andere Liste befüllt ^^
 

Ähnliche Themen

Antworten
7
Aufrufe
3.614
R
O
Antworten
6
Aufrufe
2.312
Offline
O
Antworten
13
Aufrufe
7.874
M
Antworten
87
Aufrufe
10.076
Mr_Smith
M
Zurück
Oben