ugrás a tartalomhoz

Javascript tömb átadása másik tömbnek

Totti 1986 · 2011. Szep. 6. (K), 15.22
Sziasztok!

Egy eléggé érthetetlen hibába ütköztem, és nem tudok rájönni, mi lehet a hiba oka.
Van egy függvényem:
  1. function listing(items_tmp) {  
  2.     var list_tmp = '';  
  3.   
  4.     // ne maradjon benne korabbi adat  
  5.     last_array['arg1'].length = 0;  
  6.     last_array['arg2'].length = 0;  
  7.     last_array['arg3'].length = 0;  
  8.   
  9.     // hibakereseshez  
  10.     list_tmp += last_array['arg1'][1] + '|';  
  11.     list_tmp += last_array['arg1'][2] + '|';  
  12.     list_tmp += array['arg1'][1] + '|';  
  13.     list_tmp += array['arg1'][2] + '<br />';  
  14.   
  15.     // azonnal attenni az aktualis listat a korabbi listaba  
  16.     last_array = array;  
  17.   
  18.     // hibakereseshez  
  19.     list_tmp += last_array['arg1'][1] + '|';  
  20.     list_tmp += last_array['arg1'][2] + '|';  
  21.     list_tmp += array['arg1'][1] + '|';  
  22.     list_tmp += array['arg1'][2] + '<br />';  
  23.   
  24.     // ne maradjon benne korabbi adat  
  25.     array['arg1'].length = 0;  
  26.     array['arg2'].length = 0;  
  27.     array['arg3'].length = 0;  
  28.   
  29.     // legujabb adatok  
  30.     for(var i in items_tmp) {  
  31.         var one_item_tmp = items_tmp[i].split('|');  
  32.         array['arg1'][one_item_tmp[0]] = one_item_tmp[0];  
  33.         array['arg2'][one_item_tmp[0]] = one_item_tmp[1];  
  34.         array['arg3'][one_item_tmp[0]] = one_item_tmp[2];  
  35.   
  36.         // hibakereseshez  
  37.         list_tmp += last_array['arg1'][one_item_tmp[0]] + '|' + array['arg1'][one_item_tmp[0]] + '<br />';  
  38.     }  
  39.   
  40.     // hibakereseshez  
  41.     $('#plist').html(list_tmp);  
  42. }  
Ez eredetileg úgy működne, hogy az items_tmp átadott paraméter egy tömb, aminek minden eleme egy string, ami paramétereket tartalmaz '|' jellel elválasztva. Ezeket a stringeket szedem szét, és teszem az array tömbbe.
A tömbbe írás működik, sőt, az is működik, hogy tömbbe írás előtt az array tömböt megtisztítsam az előző állapotától.
Viszont most akartam csinálni egy összehasonlítást, hogy a mostani állapot milyen elemekben különbözik az előző állapottól. Ezért csináltam egy last_array tömböt, amibe betöltöttem az array tömböt. Onnantól viszont, hogy azt a tömböt is minden futás elején üríteni akarom, az egész meggajdul. Ha bennehagyom a last_array ürítését, akkor az első hibakereső sor kiiratásánál undefined marad az array tömb minden indexe is. Pedig ott nem kéne. Ha kiszedem a last_array kiürítését, akkor a fgv. 2. meghívásakor az array tömb már rendesen működik.

A tömbök amúgy a fgv.-en kívül deklarálva vannak, nem az a hiba.
 
1

Ez így egy kicsit hiányos

bb0072 · 2011. Szep. 6. (K), 15.56
Az első lefutáskor mi a last_array és az array értéke? Mi az a paraméter amit átadsz a függvénynek? Mit vársz, hogy mi történjen? Mond hibát a javascript konzol?
2

Hiba nincs, azt

Totti 1986 · 2011. Szep. 6. (K), 16.13
Hiba nincs, azt megnéztem.
Első lefutáskor üres mindkét tömb, ezzel nincs is baj.
A paraméter egy tömb, aminek változó, hogy milyen sok eleme van.
Nagyjából így épül fel:
  1. items_tmp[0] = '1|név1|1|0|0|0';  
  2. items_tmp[1] = '2|név2|1|0|0|1';  
stb.
A paraméter átadása, szétbontása, tömbbe írása tökéletesen működik.

Azt várnám, hogy első lefutáskor az array és a last_array üres legyen.
A last_array megkapja az array ürességét.
Aztán az array megkapja az aktuális adatokat, a last_array továbbra is üres. Az array összehasonlítja az adatait a last_array-éval, ami most üres, tehát mindenképp történik egy esemény.

Második lefutáskor a last_array-t szeretném teljesen kiüríteni, majd átadni neki az array legutóbbi állapotát. Aztán az array-t ürítem. Ezután az aktuálisan átadott adatokat beírom az array-ba. Összehasonlítja az adatokat a most már nem üres last_array-jel, és ha talál különbséget, akkor ismét történik egy esemény. Ha nincs különbség, akkor nem csinál semmit.

A gond az, hogy amint a last_array-t ürítem, olyan mintha az array-t is ürítené, és fordítva. Ha az array-t üreítem, akkor valamiért a last_array is üres lesz.
3

Itt ellentmondást látok:

Poetro · 2011. Szep. 6. (K), 16.43
Itt ellentmondást látok:
  1. // ne maradjon benne korabbi adat    
  2. last_array['arg1'].length = 0;    
  3. last_array['arg2'].length = 0;    
  4. last_array['arg3'].length = 0;    
  5.   
  6. // hibakereseshez    
  7. list_tmp += last_array['arg1'][1] + '|';    
  8. list_tmp += last_array['arg1'][2] + '|';    
Most ha nulláztad a tömböt, akkor miért olvasol belőle mégis adatot?
JavaScript-ben minden nem primitív (azaz nem boolean, null, undefined, number, string) referenciaként adódik át, azaz az eredeti objektumot módosítod minden esetben.
Azaz a last_array = array; azt jelenti hogy mind a last_array, mind az array ugyanarra a tömbre fog mutatni, azaz ha valamelyiket módosítod, az mindkettőben meg fog jelenni. Amennyiben a tömböt másolni akarod, akkor arra használhatod például a concat függvényt. Például:
  1. last_array = array.concat();  
4

Volt egy ilyen megérzésem,

Totti 1986 · 2011. Szep. 6. (K), 16.55
Volt egy ilyen megérzésem, hogy ezt történik. (Javascript-ben nem vagyok annyira otthon, hogy ezt tudtam volna.)

Amint látod, az ott hibakereséshez van, tudtam, hogy undefined-ot fogok kapni, csak le akartam követni az adat változásának az útját.

Kipróbálom a concat-ot mindjárt.
5

Bár ilyen egyszerű lett

Totti 1986 · 2011. Szep. 6. (K), 18.05
Bár ilyen egyszerű lett volna!

Most valami nagyon nem jó. Most úgy adom át, hogy
  1. last_array = array.concat();  
Aztán teszek egy feltételt a last_array egyik értékére:
  1. if(last_array['arg1'][1] == 1) {  
  2.     // valami  
  3. }  
Erre nem azt kapom, hogy a last_array['arg1'][1] értéke undefined, hanem a Firebug jelez, hogy maga a "last_array.arg1 is undefined". Pedig az array-ban létezik ilyen index, így a last_array-ban is kellene lennie. Függetlenül attól, van-e benne adat.
6

Tömb

Poetro · 2011. Szep. 6. (K), 18.52
A concat csak a tömb értékeket másolja, az egyéb tulajdonságokat nem. Azaz valami hasonló kell neked:
  1. for (var i = 3; i; i -= 1) {  
  2.   last_array["arg" + i] = array["arg" + i].concat();  
  3. }  
7

Úgy látszik, sikerült, köszi

Totti 1986 · 2011. Szep. 6. (K), 20.11
Úgy látszik, sikerült, köszi szépen.

Csodálkoztam is, mikor a
  1. last_array=array.concat();  
-ot próbáltam, hogy ez messze áll a Javascript megrögzött deklaráció-mániájától.
De így már minden klappol.