Array: Element ist Pointer?
Pete
- javascript
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
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=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
Nabend Pete,
bitte poste mal Dein Steuerfluß, der das Datenfeld durchläuft und überschreibt.
Gruß aus Berlin!
eddi
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
ps:
hier noch der link zu selfhtml:
http://de.selfhtml.org/javascript/objekte/array.htm#unshift
gruß
peter
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
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