Javascript tömb átadása másik tömbnek
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: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.
■ 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);
}
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.
Ez így egy kicsit hiányos
Hiba nincs, azt
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:
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.
Itt ellentmondást látok:
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:Volt egy ilyen megérzésem,
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.
Bár ilyen egyszerű lett
Most valami nagyon nem jó. Most úgy adom át, hogy
Tömb
concat
csak a tömb értékeket másolja, az egyéb tulajdonságokat nem. Azaz valami hasonló kell neked:Úgy látszik, sikerült, köszi
Csodálkoztam is, mikor a
De így már minden klappol.