Ich habe ein Array mit Schüler- und Elternadressen.
Zum Beispiel,
const users = [{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent_address: 'USA',
relationship:'mother'
},
{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent_address: 'Spain',
relationship:'father'
},
{
id: 2,
name: 'Mark',
email: '[email protected]',
age: 28,
parent_address: 'France',
relationship:'father'
}
];
Ich versuche dies auf das folgende Ergebnis umzuformatieren.
const list = [
{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent: [
{
parent_address: 'USA',
relationship:'mother'
},{
parent_address: 'Spain',
relationship:'father'
}
]
},
{
id: 2,
name: 'Mark',
email: '[email protected]',
age: 28,
parent:[
{
parent_address: 'France',
relationship:'father'
}
]
}
];
Bisher habe ich Folgendes versucht. Ich bin mir nicht sicher, ob das der richtige Weg ist oder nicht.
const duplicateInfo = [];
for (var i = 0; i < user[0].length; i++) {
var parent = [];
if (duplicateInfo.indexOf(user[0][i].id) != -1) {
// Do duplicate stuff
} else {
// Do other
}
duplicateInfo.push(user[0][i].id);
}
javascript
arrays
Kathy
quelle
quelle
parent_address
undrelationship
zu einemparent
Objekt zusammenfügen, wenn ein doppelter Name und eine doppelte E-Mail-Adresse gefunden werden.const list = []
zuerst, aber unten iterieren Sie diese Liste anscheinend, indem Sie sie wiederholenuser[0]
. Ihr Beispielcode sollte konsistent sein.Antworten:
Ein Ansatz wäre die Verwendung
.reduce()
eines Objekts als Akkumulator. Für jede ID können Sie ein zugeordnetes Objekt mit einem übergeordneten Array speichern, an das Sie in Ihrem.reduce()
Rückruf anhängen können, wenn Sie auf ein neues Objekt mit derselben ID stoßen. Dann einen Array von Objekten aus dem Objekt zu erhalten, können Sie rufenObject.values()
auf sieSiehe Beispiel unten:
Da Sie erwähnt haben, dass Sie neu bei JS sind, ist es möglicherweise einfacher, dies zwingender zu verstehen (Einzelheiten finden Sie in den Codekommentaren):
quelle
reduce
Rückruf ist nett, aber für Anfänger vielleicht etwas schwer.Sie können das Array verkleinern und nach einem Benutzer mit derselben ID suchen und die übergeordneten Informationen hinzufügen.
Wenn der Benutzer nicht gefunden wird, fügen Sie der Ergebnismenge einen neuen Benutzer hinzu.
quelle
Solche Umstrukturierungsdaten sind weit verbreitet und
Array.reduce()
für diese Aufgabe konzipiert. Es ist eine andere Art, Dinge zu betrachten und gewöhnungsbedürftig, aber nachdem Sie den Code ein paar Mal geschrieben haben, wird es zur zweiten Natur.reduce()
wird auf einem Array aufgerufen und akzeptiert zwei Parameter:Ihre Funktion wird dann für jedes Element mit dem Startwert für den ersten Lauf oder dem Rückgabewert aus dem vorherigen Funktionsaufruf für jeden nachfolgenden Lauf entlang des Array-Elements aufgerufen, in das ursprüngliche Array indiziert und das ursprüngliche Array, das reduziert () wurde aufgerufen (die letzten beiden werden normalerweise ignoriert und selten benötigt). Es sollte das Objekt oder was auch immer Sie mit dem aktuell hinzugefügten Element aufbauen, zurückgeben, und dieser Rückgabewert wird an den nächsten Aufruf Ihrer Funktion übergeben.
Für solche Dinge habe ich normalerweise ein Objekt, um die eindeutigen Schlüssel (
id
für Sie) zu behalten , aber ich sehe, dass Sie ein Array zurückgeben möchten. Das ist eine Zeile, um das Objekt und die Schlüssel einem Array zuzuordnen, und es ist effizienter, den integrierten Objekteigenschaftsmechanismus anstelle von array.find () zu verwenden, um festzustellen, ob Sie bereits eine ID hinzugefügt haben.quelle
Sie müssen mit der aktuellen Methode zweimal iterieren. Die Komplexität ist O (n ^ 2). (für Loop + indexOf)
Eine bessere Möglichkeit besteht darin, das Array zu indizieren und den Array-Schlüssel zur Erkennung und Suche von Duplikaten zu verwenden.
Zum Beispiel:
quelle
quelle
Sie können die
Map
Sammlung verwenden, um eindeutige Elemente zu speichern und sie einfach mitfilter
folgenden Elementen zu füllen :quelle
quelle