in Javascript eine Hierarchie Abbilden mit Objekten.

Ich habe mit Objekten und Array gearbeitet.
Die Beziehung sind folgend: Mitarbeiter ist an einem Leiter gebunden, diese ist wiederum an den Chef gebunden.

Code:
function Firma(){
   var chef = [];
   var abteilungsleiter = [];
   var mitarbeiter = [];
   this.newChef = function(c) {
      if (this.chef === undefined || this.chef === null)             {
      this.chef = [];
      }
    
      this.chef.push({name:c,leiter:[]});
   }
   this.addAbteilungsleiter = function(chefName, abteilungsleiterName) {
           this2 = this;
      if (this.abteilungsleiter === undefined || this.abteilungsleiter === null)             {
      this.abteilungsleiter = [];
      }
      abteilungsleiterObj = {name:abteilungsleiterName,mitarbeiter:[]};
           this.chef.forEach(function(obj, index) {
         if(obj.name==chefName){
           this2.chef[index].leiter.push(abteilungsleiterObj);
        }
      });
      this.abteilungsleiter.push(abteilungsleiterObj);
   }
  
   this.addMitarbeiter = function(abteilungsleiterName, mitarbeiterName){
           this2 = this;
      if (this.mitarbeiter === undefined || this.mitarbeiter === null)             {
      this.mitarbeiter = [];
      }
      mitarbeiterObj = {name:mitarbeiterName};
           this.abteilungsleiter.forEach(function(obj, index) {
         if(obj.name==abteilungsleiterName){
           this2.abteilungsleiter[index].mitarbeiter.push(mitarbeiterObj);
        }
      });
      this.mitarbeiter.push(mitarbeiterObj);
   }
}
var myCompany = new Firma();
myCompany.newChef( "müller");
myCompany.newChef( "günther");
myCompany.addAbteilungsleiter( "müller", "maier" );
myCompany.addAbteilungsleiter( "müller", "frederick" );
myCompany.addAbteilungsleiter( "müller", "helmut" );
myCompany.addMitarbeiter( "maier", "hans" );
myCompany.addMitarbeiter( "maier", "hans2" );
myCompany.addMitarbeiter( "maier", "hans3" );
console.log( myCompany );

Bei console.log kannst du dir jede Stelle einzelt ansehen. (Chef/Leiter/Arbeiter).
Je nach der Position ist die Verzweigung mehr oder weniger.
 
wow danke...

sehr sehr geil!!!

@abdellaui: wie kann ich am besten überprüfen ob ein Abteilungsleiter bereits existiert???
Code:
if ( this2.chef[index].leiter.indexOf( abteilungsleiterName ) > -1 )

und ich habe noch folgenden "Fehler" gefunden...

wenn Herr Maier bei Günter und ein anderer Maier bei Müller beschäftigt ist, werden die Mitarbeiter die bei Maier beschäftigt sind "Aufgedoppelt"...
=> also muss ich die Mitarbeiter sowohl dem Chef, alsauch den Abteilungsleiter zuordnen!?
 
Das Attribut name hat die Rolle eines Schlüsselattributs, daher kommt es bei wiederholtem Einsatz zur einem logischen Fehler bzw. es enstehen Reduntanten.
In diesem Beispiel sollte daher der Name des Beschäftigten unique in seiner Abteilung sein. Solltest du jedoch Beschäftigte in der selben Abteilung mit der gleichen Namen haben wollen, so eignet sich eine id. In dem Fall würde ich bei den Methoden das Array Index als Rückgabewert definieren.

Demonstration:
Code:
function Firma(){
   var chef = [];
   var abteilungsleiter = [];
   var mitarbeiter = [];
   this.newChef = function(c) {
      if (this.chef === undefined || this.chef === null)             {
      this.chef = [];
      }
           this.chef.forEach(function(obj, index){
             if(obj.name==c){
                 console.log("Chef bereits vorhanden mit #ID:"+index);
          }
      });
      this.chef.push({name:c,leiter:[]});
      return (this.chef.length)-1;
   }
   this.addAbteilungsleiter = function(chefId, abteilungsleiterName) {
      if (this.abteilungsleiter === undefined || this.abteilungsleiter === null)             {
      this.abteilungsleiter = [];
      }
           this.abteilungsleiter.forEach(function(obj, index){
             if(obj.name==abteilungsleiterName){
                 console.log("Leiter bereits vorhanden mit #ID:"+index);
          }
      });
      abteilungsleiterObj = {name:abteilungsleiterName,mitarbeiter:[]};
           this.chef[chefId].leiter.push(abteilungsleiterObj);
      this.abteilungsleiter.push(abteilungsleiterObj);
      return (this.abteilungsleiter.length)-1;
   }
   this.addMitarbeiter = function(leiterId, mitarbeiterName){
      if (this.mitarbeiter === undefined || this.mitarbeiter === null)             {
      this.mitarbeiter = [];
      }
           this.mitarbeiter.forEach(function(obj, index){
             if(obj.name==mitarbeiterName){
                 console.log("Leiter bereits vorhanden mit #ID:"+index);
          }
      });
      mitarbeiterObj = {name:mitarbeiterName};
           this.abteilungsleiter[leiterId].mitarbeiter.push(mitarbeiterObj);
      this.mitarbeiter.push(mitarbeiterObj);
      return (this.mitarbeiter.length)-1;
   }
}
var myCompany = new Firma();
var chefMueller = myCompany.newChef( "müller");
var chefMueller2 = myCompany.newChef( "müller");
var leiterMaier = myCompany.addAbteilungsleiter( chefMueller, "maier" );
var leiterFrederick = myCompany.addAbteilungsleiter( chefMueller, "maier" );
var leiterHelmut = myCompany.addAbteilungsleiter( chefMueller, "helmut" );
var arbeiterId1 = myCompany.addMitarbeiter( leiterMaier, "hans" );
var arbeiterId2 = myCompany.addMitarbeiter( leiterMaier, "hans2" );
var arbeiterId3 = myCompany.addMitarbeiter( leiterMaier, "hans3" );
console.log( myCompany );

Zusätzlich nochmal zur Verdeutlichung: (Abfrage ob Name existiert)
Code:
           var existiertName=false;
           this.abteilungsleiter.forEach(function(obj, index){
             if(obj.name==abteilungsleiterName){
                 existiertName=true;
          }
      });
     alert('Ergebnis: '+existiertName);
 
Zurück