Pete: Array: Element ist Pointer?

Hallo,

ich habe eine Array von Arrays (also ein zweidimensionales).

Im Rahmen dessen habe ich folgende Zeile

this.content[i+1] = this.content[i];

Hierbei kopiere(?) ich die Inhalte des Elements i in das Element i+1 (diese Inhalte sind ein Array).

Wenn ich jetzt content[i] mit Inhalten überschreibe, so ändern sich analog auch die Inhalte von i+1. Heißt das, das ich gar nicht kopiert, sondern nur pointer verschoben habe?

Pete

  1. hi,

    this.content[i+1] = this.content[i];

    Hierbei kopiere(?) ich die Inhalte des Elements i in das Element i+1 (diese Inhalte sind ein Array).

    dir ist hoffentlich klar, dass das in einer schleife angewendet wenig sinnvoll ist.

    i=1 -> content[1] = content[0]
    i=2 -> content[2] = content[1]
    i=3 -> content[3] = content[2]
    i=4 -> content[4] = content[3]
    ...

    hurra, jetzt haben am ende _alle_ elemente den wert, der in element null stand/steht.

    Wenn ich jetzt content[i] mit Inhalten überschreibe, so ändern sich analog auch die Inhalte von i+1. Heißt das, das ich gar nicht kopiert, sondern nur pointer verschoben habe?

    kann es sein, dass du obiges doch nicht bedacht hast, und das dein problem daher rührt ...?

    gruß,
    wahsaga

    --
    I'll try being nicer if you'll try being smarter.
    1. i=1 -> content[1] = content[0]
      i=2 -> content[2] = content[1]
      i=3 -> content[3] = content[2]
      i=4 -> content[4] = content[3]

      Ich durchlaufe das Array rückwärts und beginne mit dem letzten Element und schiebe es 1 nach hinten bis ich an die Stelle komme an der ich das neue Element einfügen möchten. Dort ändere ich dann den content und der content vom nachfolgenden Element ändert sich analog.

      Pete

      1. Nabend Pete,

        bitte poste mal Dein Steuerfluß, der das Datenfeld durchläuft und überschreibt.

        Gruß aus Berlin!
        eddi

      2. Hi Pete,

        Ich durchlaufe das Array rückwärts und beginne mit dem letzten Element und schiebe es 1 nach hinten bis ich an die Stelle komme an der ich das neue Element einfügen möchten. Dort ändere ich dann den content und der content vom nachfolgenden Element ändert sich analog.

        ich denke auch, daß du mit deinem script nur referenzen durch die gegend schiebst und nicht die inhalte.
        nach obiger beschreibung gehe ich aber davon aus, daß der zweck der ganzen sache ist, ein element an den anfang eines arrays anzuhängen.
        hab mal n bißchen geblättert, sollte eigentlich damit gehen:

        *****************
        ARRAY.unshift();
        *****************

        nimmmt als parameter in der klammer einen oder mehrere durch komma getrennte werte(auch arrays) und fügt sie am anfang des ARRAY ein (zumindest laut meinem schlauen buch).

        gruß
        peter

        1. ps:

          hier noch der link zu selfhtml:

          http://de.selfhtml.org/javascript/objekte/array.htm#unshift

          gruß
          peter

          1. Das Problem war, dass ich ein Objekt Element habe und diese im Array verschoben haben. Allerdings kann ich halt nicht wie in c++ die Methode = überschreiben, so dass der Inhalt wirklich kopiert wurde.

            Ich habe es jetzt so gemacht

            for (i=Number(this.nbrElements)-1; i>=Number(strPos); i--) {
              this.content[i+1] = this.content[i];
             }
             this.nbrElements++;
             elm = new Element();
             elm.setName(strType);
             elm.setAttributes(aAttributes);
             elm.setData(strData);
             this.content[Number(strPos)]=elm;

            Mit unshift und splice etc. hat es bei auch nicht funktioniert.

            Pete

            1. Hi,

              Ich habe es jetzt so gemacht

              for (i=Number(this.nbrElements)-1; i>=Number(strPos); i--) {
                this.content[i+1] = this.content[i];
               }
               this.nbrElements++;
               elm = new Element();
               elm.setName(strType);
               elm.setAttributes(aAttributes);
               elm.setData(strData);
               this.content[Number(strPos)]=elm;

              Mit unshift und splice etc. hat es bei auch nicht funktioniert.

              Mit splice sollte es auch gehen, sofern dein Browser das kann.
              this.content.splice(Number(strPos), 0, elm);

              So wie du es jetzt gelöst hast, geht es natürlich auch. Wenn du das
              öfters in deinem Code brauchst, dann wäre eine Funktion geschickter.

              function InsertAt(array, elm, pos)
              {
                for (var i = array.length; i > pos; --i)
                  array[i] = array[i - 1];

              array[i] = elm;
              }

              InsertAt(this.content, Number(strPos), elm);

              oder gleich das Array-Object um eine Methode erweitern.

              Array.prototype.insert = Array_InsertAt;
              function Array_InsertAt(elm, pos)
              {
                for (var i = this.length; i > pos; --i)
                  this[i] = this[i - 1];

              this[i] = elm;
              }

              this.content.insert(Number(strPos), elm);

              Aber all dies ist jetzt nur als Nachtrag gedacht, denn du hast
              ja schon eine funktionierende Lösung.

              Was mir jetzt noch unklar ist, warum du dir die Arraygröße in nbrElements merkst, denn this.content.length liefert diese auch zurück.

              bernd