Avatar billede alexander_j Nybegynder
02. september 2003 - 23:07 Der er 14 kommentarer og
1 løsning

kopiering af array med underarrays til nyt array

t1=new Array(1,"a",[2,"b"],[],[3,"c",[4,"d"]],[]);
t2=new Array();
for(i=0;i<this.t1.length;i++){
  if(this.t1[i]==this.t1[i].toString()){
      this.t2[i]=this.t1[i];
  } else if(this.t1[i].length>0){
      this.t2[i]=[];
  }
  for(j=0;j<this.t1[i].length;j++){
      if(this.t1[i][j]==this.t1[i][j].toString()){
        this.t2[i][j]=this.t1[i][j];
      } else if(this.t1[i][j].length>0){
        this.t2[i][j]=[];
      }
      for(k=0;k<this.t1[i][j].length;k++){
        if(this.t1[i][j][k]==this.t1[i][j][k].toString()){
            this.t2[i][j][k]=this.t1[i][j][k];
        } else if(this.t1[i].length>0){
            this.t2[i][j][k]=[];
        }
      }
  }
}
Jeg bruger ovenstående kode til at kopiere indholdet af et array til et andet array - og umiddelbart giver det præcis det samme array, når jeg tracer de enkelte elementer, men i min film(http://www.vestermarie-skole.dk/tegnefilm.html), hvor jeg bruger det til at kopiere et 'billede' til et andet, der laver den fejl! - Det ser umiddelbart ud til den udelader nogle af værdierne - men hvor er fejlen?
Avatar billede barklund Nybegynder
02. september 2003 - 23:56 #1
Hvad vil du helt præcist? Vil du kunne kopiere et array fuldstændigt og genskabe indekser og værdier (samt deres typer, string, int, boolean)?

For så er det ikke så svært. Virker det ikke med den recursiveCopy, som jeg lavede til dig sidst?
Avatar billede barklund Nybegynder
02. september 2003 - 23:58 #2
Og du har jo en fejl. Strenge har også den "length" property. Så du får ikke kopieret dinne strenge ordentligt.
Avatar billede barklund Nybegynder
02. september 2003 - 23:58 #3
(tror jeg)
Avatar billede alexander_j Nybegynder
03. september 2003 - 07:30 #4
Ja jeg vil kopiere et array fuldstændigt(inklusiv genskabning af indekser og værdier(typer, string, int, boolean) ned til 3 eller 4 led)!

Min 'if(this.t1[i][j]==this.t1[i][j].toString()){...}' er lavet fordi jeg i min naivitet håbede, at jeg på den måde kunne skelne mellem om der var tale om et indeks(array?) eller om det var en string! Om dette er muligt på denne ved jeg ikke, men ellers er det nok en fejl!

Jeg forstod aldrig din recursiveCopy :(
Avatar billede alexander_j Nybegynder
03. september 2003 - 07:31 #5
Hvis du gider må du meget gerne lave et eksempel på den der rekursive copy med ovenstående array ;)
Avatar billede pyroman Nybegynder
04. september 2003 - 11:01 #6
Tror du ikke det ville blive mere overskueligt hvis du lavede objekter i stedet for arrays? Eller skal jeg bare holde mig ude af dette spm :)?

/Filip
Avatar billede alexander_j Nybegynder
04. september 2003 - 13:30 #7
Jeg er villig til hvad som helst(næsten) - jeg har blot brug for at lagre en mængde data og de skal gemmes i forskellige niveauer(ligesom i det array jeg har i eksemplet øverst på siden), og jeg har så brug for at man kan kopiere dataene og hermed rette i den nye uden at de gamle data bliver ændret!
Avatar billede barklund Nybegynder
04. september 2003 - 15:29 #8
Dette virker:

Array.prototype.recursiveCopy = function() {
    var i, l = this.length, ret = new Array();
    for (i in this) {
        ret[i] = (this[i] instanceof Array ? this[i].recursiveCopy() : this[i]);
    }
    return ret;
}
ASSetPropFlags(Array.prototype, ['recursiveCopy'], 1, 0);
foo = [["h",1],4];
bar = foo.recursiveCopy();
trace("foo: "+foo.join(";"));
trace("bar: "+bar.join(";"));
bar[0][1] = 2;
trace("foo: "+foo.join(";"));
trace("bar: "+bar.join(";"));
Avatar billede barklund Nybegynder
04. september 2003 - 15:30 #9
t1 = new Array(1,"a",[2,"b"],[],[3,"c",[4,"d"]],[]);
t2 = t1.recursiveCopy();
Avatar billede alexander_j Nybegynder
04. september 2003 - 16:04 #10
Hvor er det smukt - svaret er accepteret med bravour!

Hvis jeg nu også skal blive klogere af det her, så skal du være velkommen til at skrive et par ord om prototype og om dit script!
fx hva' pokker sker der her?
'var i, l = this.length, ret = new Array();' og her 'for (i in this) {' og 'ret[i] = (this[i] instanceof Array ? this[i].recursiveCopy() : this[i]);' og 'ASSetPropFlags(Array.prototype, ['recursiveCopy'], 1, 0);'

Kalder funktionen sig selv?
Avatar billede barklund Nybegynder
04. september 2003 - 16:27 #11
// definer en funktion på arrayets prototype, der dermed er tilgængelig for alle arrays
Array.prototype.recursiveCopy = function() {
    // init i til gennemløb
    var i;
    // init l til at huske længde
    var l = this.length;
    // init retur array
    var ret = new Array();
    // løb igennem alle properties i dette array - kopierer kun eksisterende elementer
    for (i in this) {
        // hvis elementet selv er et array, kald dets recursive copy, ellers bare kopier værdien - vil altså ikke virke på objekter
        ret[i] = (this[i] instanceof Array ? this[i].recursiveCopy() : this[i]);
    }
    return ret;
}
// skjul funktionen fra for..in's
ASSetPropFlags(Array.prototype, ['recursiveCopy'], 1, 0);
Avatar billede alexander_j Nybegynder
04. september 2003 - 17:23 #12
Det meste forstod jeg på et eller andet plan(og jeg kan se jeg skal til at prototype noget mere ;) ) - dog forstår jeg ikke rigtigt den sidste: ASSetPropFlags(Array.prototype, ['recursiveCopy'], 1, 0);

Husk at svar!
Avatar billede barklund Nybegynder
04. september 2003 - 17:27 #13
Læs mere om assetpropflags her: http://chattyfig.figleaf.com/flashcoders-wiki/?assetpropflags

(dog med forbehold for, at du bliver mere forvirret)
Avatar billede alexander_j Nybegynder
04. september 2003 - 18:07 #14
gratz
Avatar billede barklund Nybegynder
04. september 2003 - 18:19 #15
Tark
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester