hawkmaster1: Javascript Objekt ansprechen

Hallo zusammen,

ich tue mich ein wenig schwer mit unten stehenden JS code. Ich würde gerne wenn die Funktion "startScan()" aufgerufen wird den Inhalt von "destinationKind" herausbekommen. Wie ihr seht habe ich versucht dies mit var test = scanOptions.jobSetting.destinationSetting.addressbookDestinationSetting.destinationKind;

Die Struktur und die JS Objekte verstehe ich nicht ganz. Ich schreibe mal hinter die jeweiligen Zeilen einen Kommentar so wie ich es verstehe.

function startScan() {
    var scanOptions = createOptions(),//Hier wird die Variable scanOptions gefüllt durch die Funktion createOptions()
    time = ( new Date() ).getTime().toString(),
    upnum = 0,
    scannedCount, filename, reqbody, reqId, splitdata, uploadOptions, folder, reqServer;
....
     
    var test = scanOptions.jobSetting.destinationSetting.addressbookDestinationSetting.destinationKind;
    alert('die DESTINATION ist ' + test);

}

function createOptions() {
    var color = $( 'input[name="color"]:checked' ).val(),
        destination = $( 'input[name="destination"]:checked' ).val(),
        scanOptions = {
          "jobSetting":{
            "scanDevice": "auto",
            "originalSide": originalSide,
            "scanResolution": resolution,
            "scanColor": color,
            "fileSetting": {}
          }
        },
        email,destinationSetting;
    
//Hier wird doch vermutlich die variable "destinationSetting" initialisiert 

    ....
    } else if ( destination === "folder" ) {
      scanOptions.jobSetting.jobMode = "scan";
      scanOptions.jobSetting.destinationSetting = [ {
        "destinationType": "book",
        "addressbookDestinationSetting": {
          "destinationKind": "folder",
          "entryId": $( 'input[name="folder"]:checked' ).val()
        }
      } ];

    scanOptions.jobSetting = createJobSetting( scanOptions.jobSetting, capability );

    
    return( scanOptions );//Return wert als Objekt
  }

Mich würde also interessieren wie man später bei "startScan()" die Inhalte von "destinationKind" oder "entryId" bekommt?

vielen Dank viele Grüße hawk

akzeptierte Antworten

  1. Wie ihr seht habe ich versucht dies mit var test = scanOptions.jobSetting.destinationSetting.addressbookDestinationSetting.destinationKind;

    destinationSetting ist ein Array:

        scanOptions.jobSetting.destinationSetting = [ {
    

    was vermutlich nicht mal vorhanden sein mus. Du musst also dann prüfen ob destinationSetting überhaupt existiert, ob es ein Array ist und wieviele Arrayelemente vorhanden sind. Dann musst du noch wissen, auf welches (vielleicht auch alle) Element du zugreifen musst.

    1. Hallo,

      destinationSetting ist ein Array:

      ja ok, aber angenommen es ist befüllt wie spricht man dann den Inhalt an ? Also z.b. entryID ?

      Gruss

      1. Liebe(r) hawkmaster1,

        Hallo,

        destinationSetting ist ein Array:

            scanOptions.jobSetting.destinationSetting = [ {
        

        ja ok, aber angenommen es ist befüllt wie spricht man dann den Inhalt an ? Also z.b. entryID ?

        dieses Array, wenn es vorhanden ist, enthält laut Deinem Code genau ein Objekt:

              scanOptions.jobSetting.destinationSetting = [ {
                "destinationType": "book",
                "addressbookDestinationSetting": {
                  "destinationKind": "folder",
                  "entryId": $( 'input[name="folder"]:checked' ).val()
                }
              } ];
        

        Dieses Objekt kann als erstes Array-Element so erreicht werden:

        if (scanOptions.jobSetting.destinationSetting instance of Array
            && scanOptions.jobSetting.destinationSetting.length > 0
        ) {
            // ...
        }
        

        Obiger Code prüft, ob scanOptions.jobSetting.destinationSetting tatsächlich ein Array ist, und ob das Array mindestens ein Element enthält.

        Nun kann man das Objekt mit dem Array-Index 0 ansprechen:

        if (scanOptions.jobSetting.destinationSetting instance of Array
            && scanOptions.jobSetting.destinationSetting.length > 0
        ) {
        
            var dS = scanOptions.jobSetting.destinationSetting[0];
            console.dir(dS); // debug-Ausgabe der Objektstruktur auf der JS-Konsole des Browsers
        }
        

        Da in Deinem Code die Objekt-Struktur genau eine Eigenschaft "destinationType" mit String-Wert und eine Eigenschaft "addressbookDestinationSetting" mit Objekt-Wert kennt, kannst Du diese nun direkt ansprechen:

        if (scanOptions.jobSetting.destinationSetting instance of Array
            && scanOptions.jobSetting.destinationSetting.length > 0
        ) {
            // short form for easier reading
            var dS = scanOptions.jobSetting.destinationSetting[0];
        
            // dS.destinationType (string)
            console.log("destinationType: " + dS.destinationType);
        
            // dS.addressbookDestinationSetting (object)
            console.dir(dS.addressbookDestinationSetting);
        
            // properties of dS.addressbookDestinationSetting
            console.log("destinationKind: " + dS.addressbookDestinationSetting.destinationKind);
            console.log("entryId: " + dS.addressbookDestinationSetting.entryId);
        }
        

        Liebe Grüße,

        Felix Riesterer.

        1. Lieber Felix,

          ganz herzlichen Dank für deine Mühe und für die tolle Erklärung. Jetzt ist mir das mit den Eigenschaften und Objekten ein wenig verständlicher geworden :-)

          Gruss hawk

        2. Mein lieber Felix,

          also was verzapfst Du denn da für einen Quark?!

          if (scanOptions.jobSetting.destinationSetting instance of Array

          der Operator heißt "instanceof", und zwar ohne Leerzeichen!

          if (scanOptions.jobSetting.destinationSetting instanceof Array
              && scanOptions.jobSetting.destinationSetting.length > 0
          ) {
              // weiter geht's
          }
          

          Jetzt sieht der Operator auch farblich anders aus. So ist es also richtig.

          Liebe Grüße,

          Felix Riesterer.