Ich habe einen Datensatz, der den Variablennamen des Unterstrichs (_) enthält. Wie unten:
const data = {
m_name: 'my name',
m_address: 'my address',
p_1_category: 'cat 1',
p_1_name: 'name 1',
p_2_category: 'cat 2',
p_2_name: 'name 2'
}
Ich möchte sie in verschachtelte Objekte / Arrays aufteilen. Unten ist das gewünschte Ergebnis.
{
m: {
name: "my name",
address: "my address"
},
p: {
"1": {category: 'cat 1', name: 'name 1'},
"2": {category: 'cat 2', name: 'name 2'}
}
}
Wie kann ich eine rekursive Methode schreiben, um sie zu erreichen, anstatt sie fest zu codieren? Vielleicht sollte es möglich sein, tiefer verschachtelte Objekte wie "p_2_one_two_category: 'value'" in p: {2: {one: {two: category: 'value'}} zu verarbeiten.
var data ={
m_name: 'my name',
m_address: 'my address',
p_1_category: 'cat 1',
p_1_name: 'name 1',
p_2_category: 'cat 2',
p_2_name: 'name 2',
p_2_contact: '1234567',
k_id: 111,
k_name: 'abc'
}
var o ={};
Object.keys(data).forEach(key => {
var splited = key.split(/_(.+)/);
if (!o[splited[0]]) {
o[splited[0]] = {};
}
var splited1 = splited[1].split(/_(.+)/);
if (splited1.length < 3) {
o[splited[0]][splited[1]] = data[key];
} else {
if (!o[splited[0]][splited1[0]]){
o[splited[0]][splited1[0]] = {};
}
o[splited[0]][splited1[0]][splited1[1]] = data[key];
}
});
console.log(o);
m
Ist ein einfaches Objekt, kein Array von Objekten mit einer Eigenschaft.) Diese Ergebnisse scheinen viel logischer zu sein als Ihre Beispielausgabe. Wollen Sie das eigentlich?Antworten:
Sie können eine
reduce
Methode verwenden, die eine ähnliche verschachtelte Struktur nur mit Objekten erstellt.quelle
Ich weiß nicht, ob dieses Ausgabeformat das war, wonach Sie wirklich gesucht haben, oder einfach das Beste, was Sie erreichen konnten. Eine Alternative wäre, so etwas zu generieren:
Es gibt einen großen Unterschied zwischen dieser und der Ausgabe Ihres Codes.
p
ist jetzt ein einfaches Array von Objekten und kein1
- und2
-indexiertes Objekt. Es ist durchaus möglich, dass dies für Sie nicht hilfreich ist, aber es ist eine interessante Alternative. Es gibt auch einen zweiten Unterschied zu der von Ihnen gelieferten Beispielausgabe. Sowohl Ihr Originalcode als auch die Antwort von Nenad werdenm: {name: "my name", address: "my address"}
anstelle der angeforderten zurückgegebenm: [{name: "my name"}, {address: "my address"}]
. Das scheint mir viel logischer zu sein, und ich habe es auch so gemacht.Hier ist ein Code, der dies tun würde:
Dieser Code ist inspiriert von Ramda (von dem ich ein Autor bin). Die Utility - Funktionen
path
,assoc
undassocPath
ähnlichen APIs Ramda die haben, aber diese sind einzigartig Implementierungen (ausgeliehen eine andere Antwort .) Da diese in Ramda gebaut werden, nur dashydrate
würde Funktion notwendig sein , wenn Ihr Projekt Ramda verwendet.Der große Unterschied zwischen dieser und der (ausgezeichneten!) Antwort von Nenad besteht darin, dass unsere Objekthydratation den Unterschied zwischen Zeichenfolgenschlüsseln, die für einfache Objekte angenommen werden, und numerischen Schlüsseln, die für Arrays angenommen werden, berücksichtigt. Da diese jedoch aus unserer anfänglichen Zeichenfolge (
p_1_category
) herausgespalten werden, kann dies zu Mehrdeutigkeiten führen, wenn Sie manchmal möchten , dass diese Objekte sind.Ich benutze auch einen Trick, der ein bisschen hässlich ist und vielleicht nicht auf andere numerische Werte skaliert: Ich subtrahiere 1 von der Zahl, damit das
1
inp_1_category
dem nullten Index zugeordnet wird. Wenn Ihre Eingabedatenp_0_category ... p_1_category
stattdessenp_1_category ... p_2_category
so aussahen, könnten wir dies überspringen.In jedem Fall besteht die reale Möglichkeit, dass dies Ihren zugrunde liegenden Anforderungen widerspricht, aber es kann für andere nützlich sein.
quelle
path
könnteps.reduce((o = {}, p) => o[p], obj)
das gerade seinps.reduce(prop, obj)
?path
möglicherweise für diesen speziellen Fall funktioniert, verliert sie die Nullsicherheit der obigen Version. Einverstanden über die Vielfalt der Antworten; Es scheint, als könnten interessante Fragen viele interessante Alternativen hervorbringen.Keine Sortierung erforderlich
Die vorgeschlagene Ausgabe in Ihrem Beitrag folgt keinem Muster. Einige Elemente gruppieren sich zu Arrays, während andere sich zu Objekten gruppieren. Da sich Array-ähnliche Objekte wie Arrays verhalten , verwenden wir nur Objekte.
Die Ausgabe in dieser Antwort ist dieselbe wie die von Nenad, aber dieses Programm erfordert nicht, dass die Schlüssel des Objekts vorher sortiert werden -
Ausgabe -
verschmelzen
Ich leihe mir ein Generikum aus
merge
, das ich in einer anderen Antwort geschrieben habe. Die Wiederverwendung generischer Funktionen bietet zahlreiche Vorteile, die ich hier nicht wiederholen werde. Lesen Sie den Originalbeitrag, wenn Sie mehr wissen möchten -Flache Zusammenführung der Arbeit wie erwartet -
Und auch tiefe Verschmelzungen -
Erweitern Sie das folgende Snippet, um unser Ergebnis in Ihrem eigenen Browser anzuzeigen.
Code-Snippet anzeigen
quelle
Verwenden Sie die
forEach
Schleife für das Objekt.Teilen Sie den Schlüssel basierend auf dem Trennzeichen und durchlaufen Sie das Array.
Erstellen Sie bis zum letzten Schlüssel ein leeres Objekt und behalten Sie das aktuelle Objekt im Zeiger / Läufer bei.
Fügen Sie beim letzten Schlüssel einfach den Wert hinzu.
quelle