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:

function listing(items_tmp) {
	var list_tmp = '';

	// ne maradjon benne korabbi adat
	last_array['arg1'].length = 0;
	last_array['arg2'].length = 0;
	last_array['arg3'].length = 0;

	// hibakereseshez
	list_tmp += last_array['arg1'][1] + '|';
	list_tmp += last_array['arg1'][2] + '|';
	list_tmp += array['arg1'][1] + '|';
	list_tmp += array['arg1'][2] + '<br />';

	// azonnal attenni az aktualis listat a korabbi listaba
	last_array = array;

	// hibakereseshez
	list_tmp += last_array['arg1'][1] + '|';
	list_tmp += last_array['arg1'][2] + '|';
	list_tmp += array['arg1'][1] + '|';
	list_tmp += array['arg1'][2] + '<br />';

	// ne maradjon benne korabbi adat
	array['arg1'].length = 0;
	array['arg2'].length = 0;
	array['arg3'].length = 0;

	// legujabb adatok
	for(var i in items_tmp) {
		var one_item_tmp = items_tmp[i].split('|');
		array['arg1'][one_item_tmp[0]] = one_item_tmp[0];
		array['arg2'][one_item_tmp[0]] = one_item_tmp[1];
		array['arg3'][one_item_tmp[0]] = one_item_tmp[2];

		// hibakereseshez
		list_tmp += last_array['arg1'][one_item_tmp[0]] + '|' + array['arg1'][one_item_tmp[0]] + '<br />';
	}

	// hibakereseshez
	$('#plist').html(list_tmp);
}
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:

items_tmp[0] = '1|név1|1|0|0|0';
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:
    // ne maradjon benne korabbi adat  
    last_array['arg1'].length = 0;  
    last_array['arg2'].length = 0;  
    last_array['arg3'].length = 0;  
  
    // hibakereseshez  
    list_tmp += last_array['arg1'][1] + '|';  
    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:
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

last_array = array.concat();
Aztán teszek egy feltételt a last_array egyik értékére:

if(last_array['arg1'][1] == 1) {
	// valami
}
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:
for (var i = 3; i; i -= 1) {
  last_array["arg" + i] = array["arg" + i].concat();
}
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

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.