ARRAYs im Modul verändern
bearbeitet von
Hallo effel,
> Also nichts ist mit Adresse, sondern das ARRAY D wird aus dem aufrufendem Modul in den aufgerufenen Modul transportiert,d.h in das Argument D. So weit so richtig?
So weit, so leider falsch. JavaScript übergibt **immer** Werte. Aber im Fall eines Arrays ist der Wert die Arrayreferenz. Das heißt aber nicht, dass Du auf einmal einen echten call-by-reference Parameter hättest (wie in PHP durch Einsatz von & oder in C++ durch Einsatz des ref Modifikators). Das gibt es in JavaScript schlichtweg nicht.
~~~js,bad
function replace_bad(X) {
X = [ 4,5,6];
}
let A = [1, 2, 3];
replace_bad(A);
console.log(A); // -> [1,2,3]
~~~
ist was anderes als
~~~js,good
function replace_good(X) {
X.length = 0;
X[0] = 4;
X[1] = 5;
X[2] = 6;
}
let A = [1, 2, 3];
replace_good(A);
console.log(A); // -> [4,5,6]
~~~
Du musst genau zwischen Objektreferenz (bzw. Arrayreferenz) und Objekt (bzw. Array) unterscheiden. Das Objekt oder Array befindet sich nicht in der Variablen, sondern irgendwo im Speicher. Die Variable enthält nur die Referenz.
Deshalb kann replace_good in der übergebenen Arrayreferenz rummatschen und den Inhalt des Arrays, auf das A verweist, komplett verändern.
replace_bad hingegen weist X die Referenz auf ein anderes Array zu.
Wenn Du aus der m-Funktion das Objekt zurückliefern möchtest, das JSON.parse erzeugt hat, dann hast Du theoretisch mehrere Möglichkeiten.
1. **Gib es aus direct.m per return zurück**
~~~js
D = direct1.m(arg1,arg2,Prom,M,N,Tfile,ERGEB,FEHLER2);
~~~
2. **Kopiere das Ergebnis von JSON.parse nach D**
~~~js
exports.m = function(arg1,arg2,Prom,D,M,N,Tfile,ERGEB,FEHLER2) {
...
D.length = 0;
D.push(...JSON.parse(data));
}
~~~
Wenn das data-Array groß ist, könnte Dir der Spread-Operator allerdings den Stack sprengen und Du machst besser eine Schleife über die Elemente des von JSON.parse gelieferten Arrays.
~~~js
exports.m = function(arg1,arg2,Prom,D,M,N,Tfile,ERGEB,FEHLER2) {
...
D.length = 0;
const dataArray = JSON.parse(data);
for (let i = 0; i < dataArray.length; i++)
D[i] = dataArray[i];
}
~~~
3. **Übergib direct1.m ein Objekt**, in dem es das Array ablegen kann. Ggf. kann dieses Objekt auch noch mehr Eigenschaften haben und deine Parameterleiste verkürzen.
~~~js
const mParms = { };
direct1.m(arg1,arg2,Prom,mParms,M,N,Tfile,ERGEB,FEHLER2);
console.log(mParms.D);
~~~
~~~js
// in direct.js
function m(arg1,arg2,Prom,mParms,M,N,Tfile,ERGEB,FEHLER2) {
...
mParms.D = JSON.parse(data);
}
~~~
Die Klammern um JSON.parse(data) brauchst Du nicht. Aber Du solltest Dir angewöhnen, JavaScript-Statements immer mit einem Semikolon zu beenden, das kann sonst böse Überraschungen geben.
_Rolf_
--
sumpsi - posui - obstruxi