2013-06-18 21 views
5

Ich habe Objektstruktur wie untenWie kann ich diese Logik implementieren

var obj = { 
    a : 1, 
    b : [x,y,z], 
    c : [0,1,3], 
    d : ['%','-','+'] 
} 

Ich mag das Objekt konvertieren unter Format

{ 
    1 : { 
    x : { 
     0 : ['%','-','+'], // Last index remains as an array 
     1 : ['%','-','+'], 
     3 : ['%','-','+'] 
    }, 
    y : { 
     0 : ['%','-','+'], // Last index remains as an array 
     1 : ['%','-','+'], 
     3 : ['%','-','+'] 
    }, 
    z : { 
     0 : ['%','-','+'], // Last index remains as an array 
     1 : ['%','-','+'], 
     3 : ['%','-','+'] 
    } 
    } 
} 

Wenn es nach ['%','-','+'] in obigem Fall eine weitere Eigenschaft ist, Derselbe Prozess wird fortgesetzt.

var v = {}/* Object of above */, keys = Object.keys(v), simplifiedColumns = {}; 
for (var i = 0, l = keys.length; i < l ; i++) { 
     if (v[i] instanceof Array) { 

     }else{ 
       simplifiedColumns[keys[i]] = simplifiedColumns[keys[i]] || {}; 
     } 
} 

Bitte schlagen Sie mir vor, diese Logi abzuschließen c.

+5

Beachten Sie, dass 'Object.keys' die Schlüssel in einer beliebigen Reihenfolge zurückgibt, also sollten Sie die Schlüssel lexikografisch sortieren, bevor Sie beginnen. – Paulpro

+0

Wenn ich die Schlüssel sortiere, wird die Reihenfolge geändert, richtig? Meine Anforderung ist, es in Baumansicht Weise in der Reihenfolge – Exception

+3

zu generieren Die Effizienz eines Algorithmus, um dies zu tun, wird k^n (sehr ineffizient). Dies kann bei einer großen Datenmenge einfach nicht funktionieren. –

Antwort

3

Hier ist ein Algorithmus, der funktioniert, aber es wird nur ein Objekt für d. H. x, y und z erstellt und bezieht sich auf das gleiche Objekt.

Das folgende Beispiel nimmt außerdem an, dass die Reihenfolge der Schlüssel (von Object.keys()) der Reihenfolge entspricht, in der das Objekt definiert wurde. Dies wird nicht immer der Fall sein, so dass die bessere Lösung zu einem Array Ihres Objekt zu ändern wäre:

var obj = [ 
    { 
     "key": "a", 
     "value": 1 
    }, 
    { 
     "key": "b", 
     "value": ["x","y","z"] 
    }, 
    { 
     "key": "c", 
     "value": [0,1,3] 
    }, 
    { 
     "key": "d", 
     "value": ['%','-','+'] 
    } 
]; 

Aber wie auch immer, hier ist der Algorithmus der ursprüngliche Objekt Notation:

var obj = { 
    a : 1, 
    b : ["x","y","z"], 
    c : [0,1,3], 
    d : ['%','-','+'] 
}; 

var keys = Object.keys(obj); 

//set tempObj to the last array 
var tempObj = obj[keys[keys.length - 1]]; 

//traverse the rest of the keys backwards 
for (var i = keys.length - 2; i >= 0; i--) { 
    var key = keys[i]; 

    //create new empty object 
    var newObj = {}; 

    //append "tempObj" to that object and using the keys that are in the current array 
    //or if the property isn't an array, use the property itself as key 
    if (Array.isArray(obj[key])) { 
     for (var k = 0; k < obj[key].length; k++) { 
      newObj[obj[key][k]] = tempObj; 
     } 
    } else { 
     newObj[obj[key]] = tempObj; 
    } 
    //override tempObj with the new created object 
    tempObj = newObj; 
} 

FIDDLE

Btw, wenn Sie trennen müssen, unabhängige Objekte, können Sie die Zeile

newObj[obj[key]] = tempObj; 

um so etwas wie

newObj[obj[key]] = copyObject(tempObj); 

wo copyObject ist eine Funktion, die eine tiefe Kopie eines Objekts erzeugt. Aber ich denke, in diesem Fall wird die Leistung drastisch sinken, da Sie die gleichen Objekte immer wieder kopieren.

+0

keys.sort(), was zu unerwünschten Ergebnissen führen .. :(Wenn ich entfernen Art es funktioniert gut für mich ... – Exception

+0

@exception Wenn Sie die Sortier entfernen auf undefinierten Verhalten verlassen, die gerade richtig in einigen Implementierungen arbeiten geschieht von Javascript. es wird wahrscheinlich nicht in den meisten Versionen von Chrome arbeiten, aber es ist kein Fehler in Chrome. es passiert, weil Sie ein Objekt behandeln, als ob es um hat. Sie sollten in der Lage sein, Ihren Code ein wenig, so dass stattdessen neu zu schreiben ein ungeordneten Objekt: '{a: 1, b: 2}' Sie haben eine geordnete Anordnung von Paaren: '[{a: 1}, {b: 2}].' Dann können Sie wohldefinierte Verhalten in alle erhalten Javascript-Motoren. – Paulpro

+0

@Paulpro ich verstehe nicht.Warum sollte 'sort()', angewendet auf ein Array, irgendwelche Probleme verursachen? – basilikum

Verwandte Themen