Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-01-2005, 10:29   #1 (permalink)
a.k.a maddin79
 
Benutzerbild von madflanderz
 
Registriert seit: Jul 2003
Ort: berlin f-hain
Beiträge: 1.693
Array.prototype ändert das array einfach nicht

kann mir einer erklären warum folgendes script nicht funktioniert? entweder ich bin heute mal wieder zu doof zum s******* oder das stimmt was nicht.

PHP-Code:
Array.prototype.setRandom= function() {
    var 
= new Array();
    for (var 
=0i<this.length;i++)
        
c[i]=random(10);
    
trace("inside setRandom vorher: " this);
    
this c;
    
trace("inside setRandom nachher: " this);
}

= [1,2,3,4,5];
trace("anfang: " a);
a.setRandom();
trace("ende: " a)

/*Ausgabe:
anfang: 1,2,3,4,5
inside setRandom vorher: 1,2,3,4,5
inside setRandom nachher: 8,6,7,3,9
ende: 1,2,3,4,5
*/ 
in der funktion wurde das array korrekt verändert. nach ausführen der fkt ist das array aber wieder unverändert. weiß jmd woran das liegen kann?


gruß madFlanderz
__________________
www.madflanderz.de

ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°` _ addicted to bass _ `°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø
madflanderz ist offline   Mit Zitat antworten
Alt 06-01-2005, 11:03   #2 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
versuch es mal wie filgt

PHP-Code:
Array.prototype.setRandom = function() {
    var 
= new Array();
    for (var 
0i<10i++) {
        
c[i] = random(10);
    }
    return 
c;
};

= [1,2,3,4,5];
trace("anfang: " a);
a.setRandom();
trace("ende: " a
der prototype gibt nun das array zurück und du weißt es a neu zu

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 06-01-2005, 11:20   #3 (permalink)
a.k.a maddin79
 
Benutzerbild von madflanderz
 
Registriert seit: Jul 2003
Ort: berlin f-hain
Beiträge: 1.693
hehe, das kann ich auch ,

die setRandom-fkt habe ich nur als beispiel benutzt. es geht mir ums allgemeine prinzip, wie man das array direkt ändert.
ich will anstatt

a = a.setRandom()

einfach nur

a.setRandom();

schreiben. wieso kann man nicht änderungen am array selber durchführen ? und das kuriose ist ja, daß innerhalb der setRandom-fkt this die veränderten werte enthält. nach beendigung scheinen diese aber nicht übernommen zu werden.
__________________
www.madflanderz.de

ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°` _ addicted to bass _ `°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø

Geändert von maddin79 (06-01-2005 um 11:22 Uhr)
madflanderz ist offline   Mit Zitat antworten
Alt 06-01-2005, 11:30   #4 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Ich würde das Array ändern, um es zu ändern und nicht ersetzen
this ist letzlich auch nur eine lokale Variable, die auf den aktuellen Scope zeigt, deshalb siehst du die Änderung innerhalb deiner Funktion, aber nicht danach.

ActionScript:
  1. Array.prototype.setRandom= function() {
  2.     for (var i =0; i<this.length;i++){
  3.         this[i]=random(10);
  4.     }
  5. }
  6.  
  7. a = [1,2,3,4,5];
  8. trace("anfang: " + a);
  9. a.setRandom();
  10. trace("ende: " + a)

mfg r.

Geändert von bokel (06-01-2005 um 11:41 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 06-01-2005, 12:02   #5 (permalink)
a.k.a maddin79
 
Benutzerbild von madflanderz
 
Registriert seit: Jul 2003
Ort: berlin f-hain
Beiträge: 1.693
ach jungs, danke für die mühen, aber das ist nicht was ich will. klar kann ich die einzelnen elemente ansprechen aber die setRandom fkt war ja nur n beispiel um mit dem array irgendwas anzustellen. hier mal n praktisches beispiel was ich wirklich gerade verwenden will:

PHP-Code:
//- zufälliges Mischen des Arrays
    
Array.prototype.shuffle= function() {
        var 
tmp_array = new Array();
        var 
shuffle_array = new Array();
        
// Liste durchmischen
        
tmp_array this.slice();
        for (var 
i=0i<this.lengthi++) {
            var 
rand Math.round(Math.random()*(tmp_array.length-1));
            
shuffle_array.push(tmp_array[rand]);
            
tmp_array.splice(rand,1);
        }        
                 
// Liste speichern

                 
this shuffle_array.splice();   // funktioniert leider nicht
                 // es muß doch möglich sein an dieser stelle this zu überschreiben, oder muß ich etwa alle elemente einzeln umkopieren?

        //return shuffle_array;
    

Zitat:
this ist letzlich auch nur eine lokale Variable, die auf den aktuellen Scope zeigt, deshalb siehst du die Änderung innerhalb deiner Funktion, aber nicht danach.
dann wird das wohl der grund sein und dann ist die return variante wohl doch die beste/schnellste/einfachte methode,


schön tag noch
madFlanderz
__________________
www.madflanderz.de

ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°` _ addicted to bass _ `°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø
madflanderz ist offline   Mit Zitat antworten
Alt 06-01-2005, 12:11   #6 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Mach doch einfach so:

ActionScript:
  1. //- zufälliges Mischen des Arrays
  2. Array.prototype.shuffle = function() {
  3.     var count = this.length;
  4.     while( count-- > 0){
  5.         this.splice( random( this.length), 0, this.pop());
  6.     }
  7. };

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 06-01-2005, 15:49   #7 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
das problem warum das nicht geht ist, wnen ich mich recht entsinne, folgende:

unfd zwar müsstest du das array ja auf die ein oder andere art löschen.
entweder die elemente in dem array, oder aber das array selbst.

bei deiner art würdest du ja das array überschreiben wollen, ohne die einzelnen elemente anzufassen.
du sagst also nicht:
ich entferne element a aus dem array oder alle elmente, sondern du willst das array komplett überschreiben.
das geht aber technisch nur, in dem das array gelöscht und wieder neu erstellt wird.
und in dem moment, wo das array gelöscht wird, kannst du innerhalb einer klassenmethode nicht mehr mit arbeiten.
das 'this' darin ist tatsächlich auch nur ein temporärer verweis und nicht das obejkt selbst.
was anderes ist es, wenn du außerhalb dann via:
a = a.methode(); a tatsächlich mit dem ermittelten wert aus der methode überschreibst bzw. neu schreibst.

machst du es aber so, wie ralf es schon zeigte, dann werden lediglich die elemente ersetzt und neue hinzu gefügt, bzw. überflüssige elemente entfernt, aber ohne dass das array selbst verändert werden müsste.
der container bleibt also so erhalten, wie er war und nur die elemente darin werden verändert.

das ist im übrigen ein generelles problem mit 'containern'.
auch ein mc hat das...
lade mal content in nen (leeren)mc rein...

erst hat er 4 bytes, dann irgendwann hat auf einmal null bytes( was ja praktisch nicht mehr vorhanden ist, weil ja selbst ein völlig leerer mc 4 bytes haben muss scheinbar) und dann hat er auf einmal die mögliche endgröße.

da gab´s mal vor urzeiten heiße diskussionen darüber, wie man es technisch fertig bringt mögl. elemente in einen 'container' zu transferieren, ohne diesen container sozusagen 'aufzubohren'.
das war noch zu c64er zeiten...

ich denke, dass ist der grund, warum man das array nicht einfach überschreiben kann...

selbst ein:

ActionScript:
  1. var d = [];
  2. for(var i....){
  3.      d.push(random(10));
  4. }
  5. this = d.concat(); // legt eigentlich eine exakte kopie an
  6.  

kannst du zwar innerhalb der methode tracen, hat aber außerhalb keinerlei auswirkung auf das eigentliche objekt.
da wird scheinbar auch nur die referenz überschrieben, aber nicht das array selbst...

meine gedanken zu dem thema...

greetz

kelor
kelor ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele