2017-04-15 4 views
2

Mein Code:Wie Objekte konvertieren enthält Array in Objekt von Objekten

function convert(arr, parent) { 
    var out = []; 
    for(var i in arr) { 
     if(arr[i].parent == parent) { 
      var children = convert(arr, arr[i].id) 

      if(children.length) { 
       arr[i].children = children 
      } 
      out.push(arr[i]) 
     } 
    } 
    return out; //return Object.assign({}, out);tried this, but i lose parents childrens arrays 
}; 
arras = [ 
    {id: 1, name: "parent1", parent: null}, 
    {id: 2, name: "children1", parent: 1}, 
    {id: 3, name: "children2", parent: 1}, 
    {id: 4, name: "parent2", parent: null}, 
    {id: 5, name: "children3", parent: 4}, 
    {id: 6, name: "children4", parent: 4} 
] 
console.log(convert(arras, null)); 

Wie Endergebnisses

{ 
    parent1: [ 
     {name: "children1"}, 
     {name: "children2"} 
    ], 
    parent2: [ 
     {name: "children3}, 
     {name: "children4"} 
    ] 
} 

Was bisher aussehen sollte meine Ausgabe sieht: So

[ 
    {id: 1, name: "parent1", parent: null}: [ 
     {id: 2, name: "children1", parent: 1}, 
     {id: 3, name: "children2", parent: 1}, 
    ], 
    {id: 4, name: "parent2", parent: null}: [ 
     {id: 5, name: "children3", parent: 4}, 
     {id: 6, name: "children4", parent: 4} 
    ] 
] 

Erstens, was ich zu tun habe, ist das Haupt-Array in ein Objekt umzuwandeln, wenn ich dazu tendiere, verliere ich beide Eltern-Objekt-Arrays ... Außerdem muss ich das ändern Weise Konsole zeigt Objekte an, jede Hilfe wird geschätzt.

Antwort

2

Sie könnten einen Baum mit überprüfen, ob Eltern ein Wurzelknoten ist oder nicht.

var data = [{ id: 1, name: "parent1", parent: null }, { id: 2, name: "children1", parent: 1 }, { id: 3, name: "children2", parent: 1 }, { id: 4, name: "parent2", parent: null }, { id: 5, name: "children3", parent: 4 }, { id: 6, name: "children4", parent: 4 }], 
 
    tree = function (data, root) { 
 
     var r = {}, 
 
      o = {}; 
 

 
     data.forEach(function (a) { 
 
      if (a.parent === root) { 
 
       r[a.name] = []; 
 
       o[a.id] = r[a.name]; 
 
      } else { 
 
       o[a.parent] = o[a.parent] || []; 
 
       o[a.parent].push({ name: a.name }); 
 
      } 
 
     }); 
 
     return r; 
 
    }(data, null); 
 

 
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

Versuchen Sie dies.

function convert(arr) { 
 
    var parents = {}; 
 
    for (var i in arr) { 
 
    if (arr[i].parent === null) { 
 
     parents[arr[i].id] = arr[i].name 
 
    } 
 
    } 
 

 
    var out = {} 
 
    for (i in arr) { 
 
    if (arr[i].parent !== null) { 
 
     var parentName = parents[arr[i].parent]; 
 
     if (out.hasOwnProperty(parentName)) { 
 
     out[parentName].push(arr[i].name) 
 
     } else { 
 
     out[parentName] = [arr[i].name] 
 
     } 
 
    } 
 
    } 
 
    return out; 
 
}; 
 
arras = [{ 
 
    id: 1, 
 
    name: "parent1", 
 
    parent: null 
 
    }, 
 
    { 
 
    id: 2, 
 
    name: "children1", 
 
    parent: 1 
 
    }, 
 
    { 
 
    id: 3, 
 
    name: "children2", 
 
    parent: 1 
 
    }, 
 
    { 
 
    id: 4, 
 
    name: "parent2", 
 
    parent: null 
 
    }, 
 
    { 
 
    id: 5, 
 
    name: "children3", 
 
    parent: 4 
 
    }, 
 
    { 
 
    id: 6, 
 
    name: "children4", 
 
    parent: 4 
 
    } 
 
] 
 
//console.log(convert(arras, null)); 
 
alert(JSON.stringify(convert(arras)));

Aber Hinweis für Multi-Level ist es nicht korrekt funktionieren. Wenn Ihre Notwendigkeit, es muss Ihre Karte für alle möglichen übergeordneten Liste

+0

Die Funktion Art nicht von mit Kind ids beschäftigen, die nicht haben eine Eltern-ID, auf ein Array alle unvermittelten Kind Namen zuweisen 'arras.undefined', die für eine nicht ein guter Name ist Eigentum. Auch die Eltern-ID des Kindes geht dabei verloren, was ein großer Fehler wäre. – Blindman67

+0

@ Blindman67 Sie bemerken, dass korrekt ist, wenn die Eingabedaten Datensätze enthalten, ohne die Eigenschaft 'Eltern' zu haben. Aber für mich ist es nur falsche Eingabedaten –

2
arras.forEach(function(el){ 
    if(el.parent){ 
     el.parent=arras.find(e=>e.id==el.parent)||(console.error("no parent:"+el.parent),undefined); 
    } 
}); 
//resolved parent/childs.... 
var newmodel = arras.reduce(function(obj,el){ 
    if(el.parent){ 
    //child 
    obj[el.parent.name]=obj[el.parent.name]||[];//create new parent if neccessary 
    obj[el.parent.name].push({name:el.name}); 
    }else{ 
    //parent 
    obj[el.name]=obj[el.name]||[]; 
    } 
    return obj; 
    },{}); 

http://jsbin.com/renicijufi/edit?console

+1

Sie haben Tippfehler 'aras.reduce' –

+0

@PavloZhukov danke;) –

+0

Ihre Funktion schlägt fehl, wenn eine ID 0 ist – Blindman67

1

andere Art und Weise sparen:

var arrays = [ 
 
    {id: 1, name: 'parent1', parent: null}, 
 
    {id: 2, name: 'children1', parent: 1}, 
 
    {id: 3, name: 'children2', parent: 1}, 
 
    {id: 4, name: 'parent2', parent: null}, 
 
    {id: 5, name: 'children3', parent: 4}, 
 
    {id: 6, name: 'children4', parent: 4} 
 
]; 
 

 
// First, reduce the input arrays to id based map 
 
// This step help easy to select any element by id. 
 
arrays = arrays.reduce(function (map, el) { 
 
    map[el.id] = el; 
 

 
    return map; 
 
}, {}); 
 

 
var result = Object.values(arrays).reduce(function (result, el) { 
 
    if (!el.parent) { 
 
     result[el.name] = []; 
 
    } else { 
 
     result[arrays[el.parent].name].push(el.name); 
 
    } 
 

 
    return result; 
 
}, {}); 
 

 
console.log(result);

+0

Ihre Funktion schlägt fehl, wenn ein Kind eine ID von Null hat. Verfälschen Sie das ganze Ergebnis – Blindman67

1

Ich denke, das trifft Ihre Anforderung

Obj = new Object(); 

for(i in arras){ 

    person = arras[i]; 

    if(person.parent != null){ 
     if(!Obj.hasOwnProperty(person.parent)){ 
      // here instead of the index you can use Obj["parent"+person.parent] get the exact thing. If you are using that use tha in rest of the code 
      Obj[person.parent] = new Array(); 
     } 

     Obj[person.parent].push(person);  
    } 
    else{ 
     if(!Obj.hasOwnProperty(person.id)){ 
      // Some parents might have kids not in the list. If you want to ignore, just remove from the else. 
      Obj[person.id] = new Array() 
     } 
    } 
} 

Bearbeiten:

Obj = neues Objekt();

for(i in arras){ 

    person = arras[i]; 

    if(person.parent != null){ 
     if(!Obj.hasOwnProperty(person.parent)){ 
      // here instead of the index you can use Obj["parent"+person.parent] get the exact thing. If you are using that use tha in rest of the code 
      Obj[person.parent] = new Array(); 
     } 

     Obj[person.parent].push({name : person.name}); 
    } 
    else{ 
     if(!Obj.hasOwnProperty(person.id)){ 
      // Some parents might have kids not in the list. If you want to ignore, just remove from the else. 
      Obj[person.id] = new Array() 
     } 
    } 
} 

Hoffe, das hilft. :)

+0

Ihr ist der Einzige, der alle Testanwendungsfälle, die ich an ihn richtete, korrekt behandelt, keine Daten verloren, Kinder nicht falsch gruppiert (vielleicht ohne passende Eltern), abgesehen von einem kleinen Punkt. Das Ergebnis stimmt nicht mit der erforderlichen Struktur überein. 'data.parentName: [{name: childName}, ...' – Blindman67

+0

Überprüfen Sie die Änderung. Danke für das Kompliment. Vergnügen, dir zu helfen. :) –

Verwandte Themen