Stefan Ehrenreich: assoziative arrays und collections in JS

hallo an alle, die's lesen...

ich komme aus der vbs-welt (als windows-admin) und schreibe  deswegen auch webseiten-scripts in vbs (nur ie in der firma, da geht's leicht).
vor ein paar  tagen hab ich begonnen, mich mehr mit js zu befassen, weil ich einige dinge dort anscheinend besser bewerkstelligen kann. es gibt zb vererbung, konstruktoren und einige andere goodies.
andere sachen fehlen mir komplett oder ich finde sie nicht, wie zum beispiel assoziative arrays. ich kann zwar ein solches array anlegen, hab' aber keine möglichkeit (oder finde keine), alle elemente dieses arrays durchzulaufen.
mit:

var sqldb
var svgdok;
var svgbody;
var htmlbody;
var lkw = new Array();

window.onload = function() {
      init();
      }

function lkw_proto(fgnr, standort, fgFarbe, fhFarbe, achsabst1, achsabst2, achsabst3) {
 this.fgnr = "" + fgnr;
 this.standort = ">" + standort;
 this.fgFarbe = fgFarbe;
 this.fhFarbe = fhFarbe;
 this.achsabst1 = achsabst1;
 this.achsabst2 = achsabst2;
 this.achsabst3 = achsabst3;
 this.changed = true;
 this.updated = true;

this.go = function(zielort) {
  this.zielort = zielort;
  alert(this.fgnr + " " + this.zielort);
 }

this.getData = function() {
  alert(this.fgnr);
 }
}

function init() {
 sqldb = new ActiveXObject("ADODB.Connection");
// sqldb.Open("Driver={SQL Server};Server=COMPU;Database=PROD;");

svgdok = document.svghalle.getSVGDocument();
 svgbody = svgdok.getElementById("wurzel");
 htmlbody = document.getElementsByTagName("BODY")[0];
 getK4POS();

alert("fertig");

}

function getK4POS() {
 sql = "SELECT * FROM K4POS";
 var sql_k4pos = sqldb.Execute(sql);
 while (! sql_k4pos.EOF) {
  if (lkw[sql_k4pos("FGNR")]) {
   if (sql_k4pos("POS") != lkw[sql_k4pos("FGNR")].standort.slice(1)) {
    lkw[sql_k4pos("FGNR")].standort = ">" + sql_k4pos("POS");
    lkw[sql_k4pos("FGNR")].changed = true;
   }
   lkw[sql_k4pos("FGNR")].updated = true;
  }
  else {
   lkw[sql_k4pos("FGNR")] = new lkw_proto(sql_k4pos("FGNR"), sql_k4pos("POS"));
  }
  sql_k4pos.MoveNext;
 }
}

wird zwar für jeden lkw ein objekt des prototyps angelegt, und ich kann jedes object auch einzeln ansprechen, aber nicht alle objekte durchlaufen. bei array.lenght bekomme ich nur 0 zurück.
gibt es in js eine solche möglichkeit ? einzelne objekte aus dem array zu löschen, scheint ja mit array.slice möglich zu sein...

  1. Hallo,

    andere sachen fehlen mir komplett oder ich finde sie nicht, wie zum beispiel assoziative arrays. ich kann zwar ein solches array anlegen, hab' aber keine möglichkeit (oder finde keine), alle elemente dieses arrays durchzulaufen.

    In JavaScript gibt es keine Assoziativen Arrays. Aber es gibt etwas, was man wie welche benutzen kann - Objekte:

    var ass_array = new Object();
    ass_array["Vorname"] = "Papa";
    ass_array["Nachname"] = "Schlumpf";
    ass_array["Alter"] = 32;

    for (var property in ass_array) {
       alert(ass_array[property]);
    }

    Wohlgemerkt, "ass_array" ist KEIN Array! (Deswegen liefert ass_array.length auch 0 wenn überhaupt und ein push oder pop wird Dir mit dem Ding ebenfalls nicht gelingen).

    Aber du kannst das Objekt(!) "ass_array" ähnlich wie ein assoziatives Array verwenden.

    Grüße,
    Jörg

    1. Hi,

      Wohlgemerkt, "ass_array" ist KEIN Array! (Deswegen liefert ass_array.length auch 0 wenn überhaupt

      naja, es liefert undefined, sofern Du diese Eigenschaft nicht selbst erzeugst.

      und ein push oder pop wird Dir mit dem Ding ebenfalls nicht gelingen).

      Natürlich kannst Du dem Objekt diese Methoden beibringen. Eine length-Eigenschaft sollte man allerdings sinnigerweise mit einem Getter versehen - was, wenn ich es richtig in Erinnerung habe, mit dem IE schwer fallen wird.

      Aber du kannst das Objekt(!) "ass_array" ähnlich wie ein assoziatives Array verwenden.

      Jau. Und durch {klammern:'geschweift', werte:'beliebig', namen:'am besten auch in Quotes ;-)'} sogar hinreichend effizient notieren.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    [...] hab' aber keine möglichkeit (oder finde keine), alle elemente dieses arrays durchzulaufen.

    dann möchtest du vielleicht das SELFHTML-Kapitel über for-Schleifen, vor allem in der Variante for (x in obj) noch einmal aufmerksam lesen.

    Ciao,
     Martin

    --
    Butterkeksverteiler zu werden ist vermutlich eine der wenigen beruflichen Perspektiven, die sich noch bieten, wenn man einen an der Waffel hat.
      (wahsaga)