Array in Liste umwandeln
T.W.
- javascript
Hallo,
also, ich habe einen Code, der exemplarisch so aussieht:
var a = new Array( 1, 2, 3, 4, 5 ),
b = new Array( a );
Jetzt ist "b" ein zweidimensionales Array. Das will ich aber nicht, sondern ich moechte, dass "b" ein eindimensionales Array mit 5 Element ist, also eigentlich so aussieht, wie "a".
Das obige Beispiel ist jetzt vielleicht nicht so gut gewaehlt. Aber man hat es ja haeufig, dass man in einer "for"-Schleife ein paar Werte ermittelt, die man dann an eine Funktion übergeben will. Und wenn die Funktion nur Listen als Parameter verarbeiten kann, kann ich da mit Arrays nicht viel anfangen.
Im Endeffekt moechte ich das Array dereferenzieren...
Ich hoffe, Ihr versteht die Problematik...
Gruss Tobias
Hallo T.W.,
also, ich habe einen Code, der exemplarisch so aussieht:
var a = new Array( 1, 2, 3, 4, 5 ),
b = new Array( a );
Wenn Du eine echte Kopie haben willst, dann wirst Du um eine direkte Zuweisung nicht drumherum kommen.
var b = new Array(a.length);
for (var i=0; i<a.length; i++)
b[i] = a[i];
wenn die Funktion nur Listen als Parameter verarbeiten kann, kann ich da mit Arrays nicht viel anfangen.
In JavaScript gibt es keine Listen.
Ich hoffe, Ihr versteht die Problematik...
Nicht so ganz. Bis zur Erstellung der Kopie war es noch klar. Dann wiederum schreibst Du, dass Du gar keine Arrays haben willst?!
Mit freundlichem Gruß
Micha
Hallo,
var b = new Array(a.length);
for (var i=0; i<a.length; i++)
b[i] = a[i];
b = a.concat(); sollte dasselbe tun.
Mathias
--
[Visitenkarte](http://community.de.selfhtml.org/visitenkarten/view.php?key=17) · [SELFHTML Weblog](http://aktuell.de.selfhtml.org/weblog/)
Hallo molily,
b = a.concat(); sollte dasselbe tun.
das sollte afaik auf den Inhalt ankommen, den das Array hat und nicht immer eine Kopie des Arrays a ergeben.
Mit freundlichem Gruß
Micha
Hallo,
b = a.concat(); sollte dasselbe tun.
das sollte afaik auf den Inhalt ankommen, den das Array hat und nicht immer eine Kopie des Arrays a ergeben.
Ja, klar, aber genau dasselbe passiert auch beim händischen Kopieren mit einer for-Schleife.
Nur primitive values (Number-, String- und Boolean-Werte) werden kopiert, für alles andere werden Referenzen angelegt. Das gilt bei neu[i] = alt[i] genauso wie bei concat. Siehe auch Beachten Sie.
Mathias
Hallo molily,
Ja, klar, aber genau dasselbe passiert auch beim händischen Kopieren mit einer for-Schleife.
achso, Danke!
Mit freundlichem Gruß
Micha
Hallo,
danke mal für die vielen Antworten, aber ich denke ich habe mich falsch ausgedrückt.
Ich benutze "prototype" und damit wird die "Array" Klasse um die Funktion "without" erweitert. Funktioniert so:
var a = new Array( "Hallo", "Welt", "wie", "gehts?" ),
b = a.without( "Hallo", "Welt" );
// b enthält nur noch ( "wie", "gehts?" )
Hoffe, soweit ist das klar...
Jetzt will ich aber "without" mit einer dynamisch generierten Liste von Argumenten aufrufen, also ca. so: (Ist jetzt nur ein angedeutes Beispiel, ich weiss, dass man das auch anders lösen kann)
var a = new Array( "elem1", "elem2", "elem3", "elem4" ),
b = new Array(),
c;
for ( elems in document.form )
push( b, elems.value );
c = a.without( <elemente aus dem Array "b"> );
Aber "b" ist ja ein Array, die "without" Funktion will aber eine Liste im Aufruf haben.
Daher ist meine Frage: Kann ich das Array "b" in eine Liste "umwandeln"? Also eigentlich sowas wie
c = a.without( b[0], b[1], b[2] );
Nur das ich vorher nicht weiss, wieviele Elemente "b" genau hat.
Also bisher ist mir nur eine Methode mit "eval" eingefallen, aber das finde ich ziemlich "unschön"...
Ich hoffe, jetzt ist es verständlicher...
Gruss Tobias
hi,
Ich benutze "prototype" und damit wird die "Array" Klasse um die Funktion "without" erweitert. Funktioniert so:
var a = new Array( "Hallo", "Welt", "wie", "gehts?" ),
b = a.without( "Hallo", "Welt" );
Ist die Anzahl Parameter, die die Methode without entgegennimmt, dynamisch?
Wenn ja, dann hast du da ja vermutlich schon über arguments realisiert?
Jetzt will ich aber "without" mit einer dynamisch generierten Liste von Argumenten aufrufen, also ca. so: (Ist jetzt nur ein angedeutes Beispiel, ich weiss, dass man das auch anders lösen kann)
[...]
Aber "b" ist ja ein Array, die "without" Funktion will aber eine Liste im Aufruf haben.
Dann solltest du dafür sorgen, dass die Methode without selbständig ermittelt, welche "Art" von Parameter jeweils vorliegt - String bzw. Number, oder ein Array.
Leider lässt sich auf Array nicht explizit mittels typeof prüfen - da Arrays in Javascript auch nur Objekte sind, dürfte das object liefern.
Aber darüber könnte man zumindest versuchen, zwischen Skalar als Parameter oder nicht-Skalar als Parameter zu entscheiden - und dann entsprechend zu reagieren.
Bliebe nur noch zu klären, wie eine sinnvolle Fehlerbehandlung aussehen könnte, wenn ein nicht-skalarer Parameter dann eben doch kein Array ist, sich also folglich auch nicht wie ein solches iterieren lässt - oder ob man da einfach auf "Aufrufdisziplin" setzen will, sprich Methode muss entweder mit Skalar oder Array aufgerufen werden, andernfalls gibt's Murks.
gruß,
wahsaga
hallo alter nachtschwaermer,
Dann solltest du dafür sorgen, dass die Methode without selbständig
ermittelt, welche "Art" von Parameter jeweils vorliegt - String bzw.
Number, oder ein Array.
<p class="gehaessig">das kann er nicht, er benutzt doch _prototype_.<p>
... Aber darüber könnte man zumindest versuchen, zwischen Skalar als
Parameter oder nicht-Skalar als Parameter zu entscheiden - und dann
entsprechend zu reagieren. ... ...
huestel, hier geht es um JavaScript, und im waffenschrank dieser sprache
stecken die beiden ultimativen killerdevices apply und call.
... ... - oder ob man da einfach auf "Aufrufdisziplin" setzen will, sprich
Methode muss entweder mit Skalar oder Array aufgerufen werden,
andernfalls gibt's Murks.
"Aufrufdisziplin"! tss, tss - schael dich mal aus Deiner Java-Zwangsjacke.
JavaScript ist nonkonformistenkonform ;-)
so, und jetzt ab in die heia - peterS.
by(t)e by(t)e - peterS. - pseliger@gmx.net
hi,
Dann solltest du dafür sorgen, dass die Methode without selbständig
ermittelt, welche "Art" von Parameter jeweils vorliegt - String bzw.
Number, oder ein Array.<p class="gehaessig">das kann er nicht, er benutzt doch _prototype_.<p>
Und dann geht das nicht? Warum?
huestel, hier geht es um JavaScript, und im waffenschrank dieser sprache
stecken die beiden ultimativen killerdevices apply und call.
OK, die "emulieren" also quasi ein prototype-ähnliches Verhalten(?) - Methode einmal an einem Objekt definieren, und dann kann man sie für jedes Objekt (dieses Typs) aufrufen, in dem man this "austauscht"?
Interessant.
gruß,
wahsaga
Hallo,
OK, die "emulieren" also quasi ein prototype-ähnliches Verhalten(?) - Methode einmal an einem Objekt definieren, und dann kann man sie für jedes Objekt (dieses Typs) aufrufen, in dem man this "austauscht"?
Peter hat hier apply eher kreativ zweckentfremdet. Es geht nicht darum, eine Methode im Kontext eines fremden Objektes auszuführen (d.h. this auszutauschen).
c = a.without.apply(null, b); tauscht this nicht aus, weil als erster Parameter null übergeben wird (*).
b wird einfach als arguments-Array für die Methode a.without gesetzt. In dem Aufruf von a.without ist also arguments gleich b. Wenn man arguments durchläuft, durchläuft man also b.
(*) Was ich mich allerdings frage:
»If thisArg is null or undefined, the called function is passed the global object as the this value.« (ECMAScript)
this (=== a) wird also durchaus ausgetauscht durch window. Dann frage ich mich, wie man in without auf a zugreift, wenn nicht über this. Es müsste also eher a.without.apply(a, b); lauten. Wobei ich es ebenfalls vorziehen würde, eine Methode zu schreiben, die sowohl Arrays als auch Skalare annimmt. Dann gibt es keine zwei Aufrufarten und man muss bei der Anwendung überhaupt nicht drauf achten, welche Typen die Argumente haben.
Mathias
Hallo,
Leider lässt sich auf Array nicht explizit mittels typeof prüfen - da Arrays in Javascript auch nur Objekte sind, dürfte das object liefern.
Das ginge z.B. so:
if (arr.constructor === Array) {
alert("arr ist ein Array");
}
Oder auch:
if (arr instanceof Array) {
alert("arr ist ein Array");
}
Mathias
gruss T.W.
danke mal für die vielen Antworten, aber ich denke ich habe
mich falsch ausgedrückt.
das geht schon; Du hast eben die wichtigen zusatzinformationen
unterschlagen:
Ich benutze "prototype" und damit wird die "Array" Klasse um
die Funktion "without" erweitert. Funktioniert so:
...
Jetzt will ich aber "without" mit einer dynamisch generierten
Liste von Argumenten aufrufen ...
Aber "b" ist ja ein Array, die "without" Funktion will aber eine
Liste im Aufruf haben.
Du meinst eine Liste von Funktionsparametern - dann formulier
das auch so.
Daher ist meine Frage: Kann ich das Array "b" in eine Liste "umwandeln"?
nein, aber...
Also eigentlich sowas wie
c = a.without( b[0], b[1], b[2] );
Nur das ich vorher nicht weiss, wieviele Elemente "b" genau hat.
... Du kannst Dich mit der methode apply vertraut machen - und
wenn Du schon mal dabei bist, schadet auch ein blick auf call nicht.
Dein problem sollte sich wie folgt loesen lassen:
~~~javascript
var c, b = [], a = ["elem1", "elem2", "elem3", "elem4"];
// wie auch immer Du "b" mit inhalt befuellst;
c = a.without.apply(null, b);
so long - peterS. - pseliger@gmx.net
--
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]