2017-01-21 4 views
-1

Alle rekursive Ansatzlösungen zum Lösen von Array zu Objekt/s (innerhalb Array) in Plain JS (keine Bibliotheken). Grundsätzlich möchte ich die gleiche Funktion an sich senden. Zu diesem Zeitpunkt überschreibe ich das Objekt mit der letzten Iteration. i erhalten:Array von Arrays zu Objekt RECURSIVELY in Plain JS

{firstName: "Sallito", lastName: "Jordan", age: 16, role: "server"} 

während ich bekommen soll:

[ 
    {firstName: 'Eren', lastName: 'Duran', age: 22, role: 'admin'}, 
    {firstName: 'Sallito', lastName: 'Jordan', age: 16, role: 'server'} 
] 

Das ursprüngliche Array ist:

var array = [ 
    [ 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
    ], 
    [ 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
    ] 
]; 

meine aktuelle so weit Lösung ist:

function transformData(array) { 
    var obj = {}; 
    for(var i = 0; i < array.length; i++){   
     for(var j = 0; j < array[i].length; j++){ 
      for(var k = 0; k < array[i][j].length; k++){ 
       if(k === 0){ 
       var currentKey = array[i][j][k]; 
       var currentValue = array[i][j][k + 1]; 
        obj[currentKey] = currentValue; 
       } 
      } 
     } 
    } 
    return obj; 
    } 

Bitte bieten Sie j an rekursive Ideen, da ich weiß, wie man es mit forEach und map.reduce macht. Ich möchte wirklich Rekursivität lernen. Vielen Dank!

+5

bitte fügen Sie die Originaldaten hinzu. –

+0

..oder wenn keine rekursiven Lösungen ... dann: Wie überschreibe ich nicht mein Obj, sondern füge das neue Objekt dem alten zum Array hinzu? –

+0

Nina, alles ist hier ... das erwartete Ergebnis, mein Code und das Ergebnis, das ich bekomme. Vermisst wurde: [ [ ['Vorname', 'Eren'], ['Nachname', 'Duran'], ['Alter', 22], ['Rolle', 'admin'] ], [ ] ['Vorname', 'Sallito'], ['Nachname', 'Jordan'], ['Alter', 16], ['Rolle', 'Server'] ] ] // Entschuldigung! –

Antwort

0

Mit reinem JS können Sie wie folgt vorgehen;

var data = [ [ ['firstName', 'Eren'], 
 
       ['lastName', 'Duran'], 
 
       ['age', 22], 
 
       ['role', 'admin'] ], 
 
      [ ['firstName', 'Sallito'], 
 
       ['lastName', 'Jordan'], 
 
       ['age', 16], 
 
       ['role', 'server'] ] 
 
      ], 
 
objData = data.map(a => a.reduce((o,t) => Object.assign(o,{[t[0]]:t[1]}),{})); 
 
console.log(objData);

Erläuterung: Wir .map() über dem Hauptarray Anwendung und es ist Subarrays zu a Argument zugewiesen sind darin Rückruf nacheinander für jede Umdrehung ist. Also in der ersten Kurve a ist;

[ ['firstName', 'Eren'], 
    ['lastName', 'Duran'], 
    ['age', 22], 
    ['role', 'admin'] ], 

Nun a ist ein Array mit Subarray Artikel (Tupeln - Wertepaare), die wir in einem Objekt verbinden möchten. Die Anwendung von .reduce() auf a ist sehr praktisch für diesen Job.

a.reduce((o,t) => Object.assign(o,{[t[0]]:t[1]}),{}) 

Unsere .reduce() Funktion ist die Art, die einen Anfangswert einnimmt, der der letzte Teil des obigen Codes ist, ...,{}). Dieses anfänglich leere Objekt wird dem ersten Argument des Callbacks o zugewiesen. Dann wird jedes Tupel wie ['firstName', 'Eren'] dem zweiten Argument des Callbacks t einzeln bei jedem Zug zugewiesen. Sie werden in dem leeren Objekt mit Hilfe der Anweisung Object.assign(o,{[t[0]]:t[1]}) angesammelt. Es wird den aktuellen leeren Wert von o nehmen und ({firstname: "Eren"}) mit ihm zusammenführen (beitreten). Die Pfeilfunktion gibt die Ausgabe Object.assign() als neuen o Wert zurück, der in der nächsten Runde verwendet werden soll. In der nächsten Runde ist o jetzt {firstname: "Eren"} und t ist ["lastname", "Duran"] und wenn wir die Werte ersetzen wir jetzt Object.assign({firstname: "Eren"},{lastname: "Duran"}) haben die {firstname: "Eren", lastname: "Duran"} zurückkehren wird, und dies wird als neue o und so weiter zurückgeführt wird ...

so hoffe ich, es ist klar, jetzt.

+0

das ist nicht rekursiv ... –

+0

@Nina Scholz In einem Kommentar erwähnt er "..oder wenn keine rekursiven Lösungen ... dann: wie überschreibe ich mein Objekt nicht ..." – Redu

+0

Dieser Code macht den Job- aber ich habe keine Ahnung wie. Reduzieren ist eine Black-Box für mich: Was und wie o, t arbeite ich nicht verstehen. Ich kann sogar auf Mozzilla lesen, dass o ein Akkumulator ist und t ein Wert ist - aber wie sind Sie zu dieser Lösung gekommen und woher wussten Sie im Voraus, dass Sie sich das vorstellen können - bravo! –

0

Nicht sicher über rekursive Lösung (und ich denke, Sie brauchen es nicht in diesem speziellen Fall, Sie benötigen eine, wenn tiefere Verschachtelung vorhanden ist, wenn Sie viele Sub-Arrays in Sub-Arrays von Main haben Array).

Ihre aktuelle Lösung funktioniert fast gut, Sie benötigen nur zwei Fixes, neue Objekt bei jeder Iteration, nicht am Anfang der Funktion (deshalb wurde der vorherige Wert überschrieben), und ein letztes Array, um erstellte Objekte schieben .Etwas wie folgt aus:

var array = [ 
 
    [ 
 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
 
    ], 
 
    [ 
 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
 
    ] 
 
]; 
 
function transformData(array) { 
 
    
 
    final=[]; 
 
    for(var i = 0; i < array.length; i++){ 
 
    var obj = {}; // create new object inside loop -> number of objects, number of arrays 
 
     for(var j = 0; j < array[i].length; j++){ 
 
      for(var k = 0; k < array[i][j].length; k++){ 
 
       if(k === 0){ 
 
       var currentKey = array[i][j][k]; 
 
       var currentValue = array[i][j][k + 1]; 
 
        obj[currentKey] = currentValue; 
 
       } 
 
        
 
      } 
 
     } 
 
     final.push(obj); // push objects into final array 
 
    } 
 
    
 
    return final; 
 
    } 
 
    
 
    console.log(transformData(array));

Hier ist (imho) vereinfachte Version, die die Arbeit erledigt, auch:

var array = [ 
 
    [ 
 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
 
    ], 
 
    [ 
 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
 
    ] 
 
]; 
 

 
function transform(data) { 
 
output=[]; 
 
data.forEach(function(el) { 
 
obj={}; 
 
for(j=0;j<el.length;j++) { 
 
obj[el[j][0]]=el[j][1]; 
 
} 
 
output.push(obj); 
 
}); 
 
return output; 
 

 
} 
 

 
console.log(transform(array));

P. S. @Redu Antwort ist mehr Javascript-y, und reduzieren ist groß, natürlich, das ist nur für Anfänger (mit Erklärung, was im ursprünglichen Code falsch war). ;)

Verwandte Themen