JS verwendet die Methode „reduce()“, um Baumstrukturdaten zu verarbeiten

JS verwendet die Methode „reduce()“, um Baumstrukturdaten zu verarbeiten

Definition

Die Methode „reduce()“ führt eine Reduzierungsfunktion aus, die Sie für jedes Element im Array bereitstellen (in aufsteigender Reihenfolge), und fasst die Ergebnisse in einem einzigen Rückgabewert zusammen.

reduce() durchläuft wie forEach(), map() und filter() auch jedes Element im Array, aber reduce() kann mit dem aktuell durchlaufenen Element auf dem Ergebnis des zuvor durchlaufenen Array-Elements operieren.

Grammatik

array.reduce(Funktion(vorherige, aktuelle, Index, Array){
    ...
}, init);

Parameter in der Callback-Funktion:

  • prev Erforderlich. Gibt den Rückgabewert beim Aufruf des Callbacks bzw. den Anfangswert init an.
  • cur Erforderlich. Stellt das aktuelle Element dar.
  • Index Optional. Gibt den Index des aktuellen Elements an.
  • Array stellt das ursprüngliche Array dar.
  • init Optional. Der Anfangswert, der als erstes Argument des ersten Aufrufs der Rückruffunktion verwendet wird.

Gemeinsame Parameter: prev und cur

Hinweis: Wenn die Rückruffunktion zum ersten Mal ausgeführt wird, gibt es zwei Fälle für die Werte von prev und cur: Wenn beim Aufruf von reduce() der Anfangswert init angegeben wird, übernimmt prev den Anfangswert und cur den ersten Wert im Array und der Index beginnt bei 0; wenn der Anfangswert init nicht angegeben wird, übernimmt prev den ersten Wert im Array und cur den zweiten Wert im Array und der Index beginnt bei 1.

Beispiele

1. Es wird kein Anfangswert init übergeben

const arr = [1, 3, 5, 7]
arr.reduce(Funktion(vorherige, aktuell, Index, arr){
    console.log(vorherige, aktuell, index)
    Zurück Vorherige + Aktuelle
})

Die Parameter und Rückgabewerte für jeden Aufruf sind wie folgt:

Rückruf Zurück aktuell Index Anordnung Rückgabewert
Zum 1. Mal 1 3 1 [1, 3, 5, 7] 4
2. Mal 4 5 2 [1, 3, 5, 7] 9
3. Platz 9 7 3 [1, 3, 5, 7] 16

Da kein Anfangswert übergeben wird, beginnt der Index bei 1. Der Rückruf wird dreimal aufgerufen. Zu Beginn ist der Wert von prev 1, das erste Element im Array, und der Wert von cur ist 3. Nach der Addition wird der Rückgabewert 4 als prev-Wert der nächsten Rückrufrunde verwendet. Anschließend wird die nächste Rückrufrunde fortgesetzt, bis sie abgeschlossen und zurückgegeben wird.

2. Bei der Übergabe des Anfangswertes

const arr = [1, 3, 5, 7]
arr.reduce(Funktion(vorherige, aktuell, Index, arr){
    console.log(vorherige, aktuell, index)
    Zurück Vorherige + Aktuelle
}, 10)

Die Parameter und Rückgabewerte für jeden Aufruf sind wie folgt:

Rückruf Zurück aktuell Index Anordnung Rückgabewert
Zum 1. Mal 10 1 0 [1, 3, 5, 7] 11
2. Mal 11 3 1 [1, 3, 5, 7] 14
3. Platz 14 5 2 [1, 3, 5, 7] 19
4. Platz 19 7 3 [1, 3, 5, 7] 26

3. Array-Deduplizierung

const arr = ['ab', 'v', 'd', 'ab', 'h', 'e', ​​​​'dc', 'e', ​​​​'e', ​​'f']
const newArr = arr.reduce(Funktion(vorherige, aktuelle){
    !vorherige.includes(aktuell) && vorherige.push(aktuell)
    Zurück Zurück
}, [])
console.log(newArr) // ["ab", "v", "d", "h", "e", "dc", "f"]

Die durchzuführenden Schritte sind wie folgt:

  • Initialisieren Sie ein leeres Array
  • Beim ersten Aufruf ist prev der Anfangswert, also ein leeres Array, und cur ist das erste Element im Array, arr[1]. Dann wird prev durchsucht, um zu sehen, ob cur bereits existiert. Wenn nicht, wird das Element zu prev hinzugefügt und prev kehrt zurück, um den nächsten Rückruf einzugeben.
  • Im zweiten Callback ist prev der Rückgabewert des ersten Callbacks, cur ist das zweite Element im Array arr[2], und dann wird prev durchsucht, um zu sehen, ob cur bereits existiert. Wenn nicht, wird das Element zu prev hinzugefügt, und prev kehrt zurück, um den nächsten Callback einzugeben.
  • Geben Sie abschließend das vorherige Array zurück

4. Verwenden Sie „Reduce“, um Object-Objekte in einem Array zu gruppieren und zusammenzuführen

//Holen Sie sich das Objekt-Array aus dem Hintergrund, gruppieren Sie es nach Objekttyp und fügen Sie es zu einem Baum zusammen, um die Daten anzuzeigen const dataArr = [
    { Typ: 'Governance-Ebene', Name: 'hive_82', Reserve: '2', ID: 1 },
    { Typ: 'Ursprüngliche Datenebene', Name: 'qwe', Reserve: '1', ID: 2 },
    { Typ: 'Quellebene', Name: 'mysql_exchangis', Reserve: '3', ID: 3 },
    { Typ: 'Governance-Ebene', Name: 'links_188', Reserve: '1', ID: 4 },
    { Typ: 'Quellebene', Name: 'mysql_ces', Reserve: '2', ID: 5 }
]
const treeData = dataArr.reduce((cur, next) => {
    const obj = cur.find(curItem => curItem.label === nächster.Typ)
    wenn (Objekt) {
        if (obj.children.indexOf(next.id) === -1) { //Deduplizierung obj.children.push({ 
                ...nächste, 
                Bezeichnung: nächster.name 
            })
        }
    } anders {
        const neuesObj = {
            Bezeichnung: nächster.Typ,
            Kinder: [{
                ...nächste,
                Bezeichnung: nächster.name
            }]
        }
        cur.push(neuesObjekt)
    }
    Rückgabewert aktuell
}, [])
​
// Das Ergebnis nach dem Zusammenführen:
Baumdaten = [
    {
        Bezeichnung: „Governance“,
        Kinder: [
            { Typ: 'Governance-Ebene', Name: 'hive_82', Reserve: '2', ID: 1, Bezeichnung: 'hive_82' },
            { Typ: ‚Governance-Ebene‘, Name: ‚links_188‘, Reserve: ‚1‘, ID: 4, Bezeichnung: ‚links_188‘ }
        ]
    },
    {
        Bezeichnung: 'Ursprüngliche Datenebene',
        Kinder: [
            { Typ: ‚Ursprüngliche Datenebene‘, Name: ‚qwe‘, Reserve: ‚1‘, ID: 2, Bezeichnung: ‚qwe‘ }
        ]
    },
    {
        Bezeichnung: 'Quellebene',
        Kinder: [
            { Typ: 'Quellebene', Name: 'mysql_exchangis', Reserve: '3', ID: 3, Bezeichnung: 'mysql_exchangis' },
            { Typ: ‚Governance-Ebene‘, Name: ‚mysql_ces‘, Reserve: ‚2‘, ID: 5, Bezeichnung: ‚mysql_ces‘ }
        ]
    }
]

5. Verwenden Sie „Reduce“, um die vom Menü-Backend zurückgegebene Menüstruktur zu verarbeiten

Diese Daten müssen basierend auf der ParentId in eine hierarchische Struktur konvertiert werden.

Methode 1:

const DatenArr = [
    {id: '18', name: 'Passwort zurücksetzen', parentId: '30', parentName: 'Benutzerverwaltung'}, 
    {id: '13', name: 'Überwachungsprotokoll', parentId: '29', parentName: 'Systemverwaltung'}, 
    {id: '29', name: 'Systemverwaltung', parentId: '0', parentName: null}, 
    {id: '14', name: 'Ändern', parentId: '33', parentName: 'Abteilungsleitung'}, 
    {id: '2', name: 'Benutzerliste', parentId: '30', parentName: 'Benutzerverwaltung'}, 
    {id: '30', name: 'Benutzerverwaltung', parentId: '29', parentName: 'Systemverwaltung'}, 
    {id: '33', name: 'Abteilungsleitung', parentId: '0', parentName: null}, 
    {id: '37', name: 'Benutzer hinzufügen', parentId: '30', parentName: 'Benutzerverwaltung'}, 
    {id: '6', name: 'Hinzufügen', parentId: '33', parentName: 'Abteilungsleitung'}, 
    {id: '7',name: 'Löschen', parentId: '33', parentName: 'Abteilungsleitung'}
]
//Erstellen Sie eine Zuordnungsbeziehung für die Menü-ID const idMapping = dataArr.reduce((prev, next, i) => {
    vorherige[nächste.id] = i
    Zurück Zurück
}, {})
​
const treeData = []
dataArr.map(el => {
    // Menü der ersten Ebene wenn (el.parentId === '0') {
        treeData.push(el)
        zurückkehren
    }
    
    // Finde das übergeordnete Element durch Mapping const parentEl = dataArr[idMapping[el.parentId]] 
​
    // Füge das aktuelle Element dem `children`-Array des übergeordneten Elements hinzu parentEl.children = [...(parentEl.children || []), el]
})
console.log(Baumdaten)

Methode 2:

//Erstellen Sie eine Zuordnungsbeziehung basierend auf der übergeordneten ID const result = dataArr.reduce((prev, next) => {
    vorherige[nächste.parentId] ? vorherige[nächste.parentId].push(nächste) : vorherige[nächste.parentId] = [nächste];
    zurück vorh.;
}, {});
       
Objekt.Schlüssel(Ergebnis).Map(Schlüssel => {
    Ergebnis[Schlüssel].map((Element, i) => {
        Ergebnis[item.id] ? item.children = Ergebnis[item.id] : ''
    });
}) 
this.treeData = Ergebnis[0]
console.log(Baumdaten)

Dies kann auch durch Rekursion erreicht werden, was aber nicht im Detail beschrieben wird.

Die endgültige Datenstruktur ist in der folgenden Abbildung dargestellt:

Oben sind die Details, wie JS die Methode „reduce()“ verwendet, um Baumstrukturdaten zu verarbeiten. Weitere Informationen zu JS finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • JavaScript-Datenstruktur: Erstellen einer Hash-Tabelle (1)
  • Wörterbuchmethode für JavaScript-Datenstrukturen
  • Erstellen einer JavaScript-Datenstruktursammlung (2)
  • Erstellen einer JavaScript-Datenstruktursammlung (1)
  • Detaillierte Erklärung der Map-Datenstruktur in JavaScript
  • Konvertieren Sie die Datenstruktur der Go-Sprache in JSON
  • Effizienter JavaScript-Algorithmus zum Konvertieren flacher Daten in eine Baumstruktur
  • js realisiert eine unendliche hierarchische Baumdatenstruktur (innovativer Algorithmus)
  • JavaScript-Datenstruktur: Erstellen einer Hash-Tabelle (2)

<<:  Beispiel zur Optimierung der MySQL-Einfügeleistung

>>:  Detaillierte Erklärung der Gründe und Optimierungen für den großen Offset, der die Leistung bei MySQL-Abfragen beeinträchtigt

Artikel empfehlen

Warum wirkt sich die Verwendung von Limits in MySQL auf die Leistung aus?

Lassen Sie mich zunächst die MySQL-Version erklär...

So löschen Sie schnell alle Tabellen in MySQL, ohne die Datenbank zu löschen

Dieser Artikel beschreibt anhand eines Beispiels,...

Detaillierte Erläuterung der Docker Volume-Berechtigungsverwaltung

Das Datenvolumen ist ein wichtiges Konzept von Do...

So verwenden Sie DQL-Befehle zum Abfragen von Daten in MySQL

In diesem Artikel zeigt Ihnen der Blogger die häu...

Zusammenfassung der 11 häufigsten Fehler von MySQL-Anfängern

Vorwort Sie erhalten möglicherweise häufig Warn-E...

So konfigurieren Sie mehrere Tomcats mit Nginx-Lastausgleich unter Linux

Die Methoden zur Installation von Nginx und mehre...

Docker-Compose erstellt schnell Schritte für ein privates Docker-Warehouse

Erstellen Sie docker-compose.yml und füllen Sie d...

Mehrere beliebte Website-Navigationsrichtungen in der Zukunft

<br />Dies ist nicht nur ein Zeitalter der I...

Nginx-Dienst 500: Interner Serverfehler einer der Gründe

500 (Interner Serverfehler) Auf dem Server ist ei...

Implementierung der Anmeldeseite des tatsächlichen Kampfprotokolls von Vue

Inhaltsverzeichnis 1. Vorbereitende Maßnahmen 1.1...

Teilen Sie 10 der neuesten Web-Frontend-Frameworks (Übersetzung)

In der Welt der Webentwicklung sind Frameworks wei...

Einige Tipps zum Schreiben leistungsstarker HTML-Anwendungen

Wie können Sie die Leistung einer Webseite verbes...