Array an funktion übergeben
JensM
- javascript
Hallo,
Ich habe eine Funktion hier im Forum gefundne welche ich versuche in meine momentan genutzte Funktion einzubinden:
http://forum.de.selfhtml.org/archiv/2002/10/t27390/#m149264
Ich habe diese Funktion wie folgt eingebunden:
Keyword = new Object();
Keyword[0] = 13
Keyword[1] = "test"
Keyword[2] = "text"
Keyword[3] = "ton"
Keyword[4] = "laut"
Keyword[5] = "test"
Keyword[6] = "ton"
Keyword[7] = "testton"
Keyword[8] = "text"
Keyword[9] = "text"
Keyword[10] = "text2"
Keyword[11] = "test"
Keyword[12] = "ton"
Keyword[13] = "laut"
function dme(a1) // delete multiple entries (array)
{
var a2 = new Array();
var a3 = new Array();
for(var i = 0; i < a1.length; i++)
{
if(typeof(a2[a1[i]]) == "undefined")
{
a2[a1[i]] = true;
a3[a3.length] = a1[i];
}
}
var a4 = new Array();
for(var i = 0; i < a3.length; i++){a4[a4.length] = a3[i]}
return a4;
}
var data = new Array();
var data2 = new Array();
for (var i=1; i <= Keyword[0]; i++)
data2.push(Keyword[i]);
data2.sort()
data = dme(data).join(",")
window.onload = function ()
{
AutoComplete_Create('searchfor', data2, 6);
alert(data+"\n\n"+data2)
}
wenn ich dieses Script ausführe bekomme ich ein Alert welches mir den kompletten Array und dne Array bei welchem alle doppelten rausgelöscht sind anzeigt.
Vom aufbau sind diese gleich (Keine Leerzeichen)
So nun zum Problem:
Die Variable "data" soll an die Funktion "AutoComplete_Create" übergeben werden
Dies funktioniert augenscheinlich auch, wenn ich mir das alert in der Funktion anzeigen lasse sehe ich auch dort den richtigen Array.
Allerdings funktioniert die nachgeschaltete Funktion nur wenn ich den orginal array (data2)nehme.
Im IE bekomme ich eine Fehlermeldung welche Aussagt das "'_autocomplete[...].data[...]'ist Null oder kein Objekt"
IM Firefox jedoch bekomme ich einen Zeilenumbruc nach jedem Buchstaben.
Kann es sein Das in dem Array Zeilenumbrüche übertragen werden?
Oder werden die Daten von dem Obenstehen Script dahingehen verfälscht?
Vielen Dank Vorab.
MFG
Hi,
Dies funktioniert augenscheinlich auch, wenn ich mir das alert in der Funktion anzeigen lasse sehe ich auch dort den richtigen Array.
falsch.
Allerdings funktioniert die nachgeschaltete Funktion nur wenn ich den orginal array (data2)nehme.
Interessanterweise zeigst Du uns diese Funktion, um die es offensichtlich in Deiner Frage geht, nicht, sondern statt dessen eine andere, die mit Deinem Problem gar nichts zu tun hat. Wie auch immer, die Funktion scheint ein Array zu erwarten; statt dessen lieferst Du ihr einen String.
Kann es sein Das in dem Array Zeilenumbrüche übertragen werden?
Du arbeitest an der Stelle nicht mit einem Array.
Cheatah
Interessanterweise zeigst Du uns diese Funktion, um die es offensichtlich in Deiner Frage geht, nicht, sondern statt dessen eine andere, die mit Deinem Problem gar nichts zu tun hat. Wie auch immer, die Funktion scheint ein Array zu erwarten; statt dessen lieferst Du ihr einen String.
Ich habe die Funktion welche hinten an steht nicht mitgeliefert weil sie etwas umfangreicher ist und es mir eigentlich nur darum geht das ich ihr einen array übergeben muss. wie bekomme ich den String wieder zu einem Array?
Hallo,
[...] es mir eigentlich nur darum geht das ich ihr einen array übergeben muss. wie bekomme ich den String wieder zu einem Array?
Falsche Frage.
Sie muss lauten: Warum, zum Geier, mache ich denn das Array zu einem String, wo ich es doch als Array weitergeben will?
Nur wegen der Anzeige mit alert? alert zeigt auch Arrays als kommagetrennte Listen an, dafür muss man sie nicht erst zum String transformieren.
Deine Funktion zum Entfernen von Duplikaten ist übrigens grässlich.
Gruß, Don P
Deine Funktion zum Entfernen von Duplikaten ist übrigens grässlich.
Ich muss die Werte an meine Funktion kommagetrennt weitergeben.
Es geht mir darum das diese "grässliche" Funktion zum doppelten entfernen etwas mit dem String macht weswegen der String nicht mehr von der Funktion gelesen werden kann.
Hast du eine bessere Funktion zum doppelten entfernen?
Danke vorab
Hallo,
[...] es mir eigentlich nur darum geht das ich ihr einen array übergeben muss.
Ich muss die Werte an meine Funktion kommagetrennt weitergeben.
Ja was denn nun, als Array oder als String mit Kommata?
Hast du eine bessere Funktion zum doppelten entfernen?
Ich denke schon. Für alle Arrays:
Array.prototype.unique = function(){
for (var v, o={}, a=[], n=this.length, i=0; i<n; i++) {
v = this[i];
(v in o) || (o[v] = !a.push(v));
}
return a;
};
Oder individuell:
myArray.unique = function(a){
for (var v, o={}, b=[], n=a.length, i=0; i<n; i++) {
v = a[i];
(v in o) || (o[v] = !b.push(v));
}
return b;
};
Funktioniert aber nur, wenn die Werte im Array vergleichbar sind, d.h. einen Wert haben, der als String interpretiert werden kann, also wenn es Strings, Zahlen oder boolesche Werte sind.
Gruß, Don P
Hallo,
Die letzte ist Quatsch, ich meinte es so:
var unique = function(a){
for (var v, o={}, b=[], n=a.length, i=0; i<n; i++) {
v = a[i];
(v in o) || (o[v] = !b.push(v));
}
return b;
};
//Beispiel:
var myArray = [1,1,2,5,4,3,3,4,7,8,2,1];
alert(unique(myArray)); // ergibt: 1,2,5,4,3,7,8
Gruß, Don P
Hi Don P,
Danke für das Script. Funktioniert super.
Habs gerade eingebunden.
mfg JensM
Ich denke schon. Für alle Arrays:
Array.prototype.unique = function(){
for (var v, o={}, a=[], n=this.length, i=0; i<n; i++) {
v = this[i];
(v in o) || (o[v] = !a.push(v));}
return a;
};
Schöne Funktion!
Aber if ist in manchen Browsern schneller (in anderen sind beide Varianten identisch) und vielleicht für manche, die das lesen, verständlicher:
~~~javascript
Array.prototype.unique_if = function(){
var o = {}, a = [], n = this.length;
for(var i = 0; i < n; i++) {
var v = this[i];
if(!o[v]) o[v] = a.push(v);
}
return a;
};
Struppi.
Hallo,
Array.prototype.unique = function(){
for (var v, o={}, a=[], n=this.length, i=0; i<n; i++) {
v = this[i];
(v in o) || (o[v] = !a.push(v));}
return a;
};
>
> Schöne Funktion!
Danke.
> Aber if ist in manchen Browsern schneller (in anderen sind beide Varianten identisch)
Ja, klingt komisch, is leider so.
`(v in o)`{:.language-javascript} habe ich bewusst so gewählt, weil damit auch intuitiv deutlich wird, dass es nur darum geht, ob v der Name einer Eigenschaft `in o`{:.language-javascript} ist, oder nicht.
Bei der if-Variante wird dagegen der Inhalt o[v] abgefragt, nicht die bloße Tatsache, ob einer existiert.
Auch die Zuweisung von `!a.push(v)`{:.language-javascript} ist Absicht: o[v] wird wegen der Negation nur mit einem booleschen Wert belegt (immer `false`{:.language-javascript}), der ohnehin nicht von Bedeutung ist. Deine if-Variante weist unnötig den ganzen Rückgabewert von `push`{:.language-javascript} zu (die aktuelle Länge von a).
Gruß, Don P
Aber if ist in manchen Browsern schneller (in anderen sind beide Varianten identisch)
Ja, klingt komisch, is leider so.
Hat mich auch gewundert.
(v in o)
habe ich bewusst so gewählt, weil damit auch intuitiv deutlich wird, dass es nur darum geht, ob v der Name einer Eigenschaftin o
ist, oder nicht.
Bei der if-Variante wird dagegen der Inhalt o[v] abgefragt, nicht die bloße Tatsache, ob einer existiert.
Naja, du kannst auch if(v in o) schreiben, dann wird's noch deutlicher - ist aber eben ein bisschen langsamer.
Auch die Zuweisung von
!a.push(v)
ist Absicht: o[v] wird wegen der Negation nur mit einem booleschen Wert belegt (immerfalse
), der ohnehin nicht von Bedeutung ist. Deine if-Variante weist unnötig den ganzen Rückgabewert vonpush
zu (die aktuelle Länge von a).
Auch das hatte ich gemacht weil es eine unnötige Operation ist und ob man wirklich irgendetwas spart wenn man statt eines integer Wert einen boolschen Wert nimmt, halte ich für sehr fraglich.
Struppi.
Hallo,
ob man wirklich irgendetwas spart wenn man statt eines integer Wert einen boolschen Wert nimmt, halte ich für sehr fraglich.
Denke man spart zumindest etwas Speicher, da Zahlen immer Float-Typen sind. Integer gibt's meines Wissens in JS nicht wirklich.
Gruß, Don P