String in Array finden
Manuel
- javascript
Hallo!
Ich möchte als Bedingung in einer if-Schleife die Überprüfung angeben, ob ein String in einem Array vorhanden ist.
Eine vergleichbare Abfrage in Delphi würde z.B. lauten:
if (string IN var) then ...
kurz: ich habe ein Array mit Zahlen und eine Variable die eine Zahl enthält und wenn diese Zahl auch im Array vorhanden ist, soll true zurückgegeben werden. Oder vergleichbare Lösung...
Vielen Dank, sollte eigentlich leicht sein.
gruss, manu
Hallo Manuel.
Ich möchte als Bedingung in einer if-Schleife die Überprüfung angeben, ob ein String in einem Array vorhanden ist.
Schau dir mal die String-Funktionen an (insbesondere indexOf):
http://de.selfhtml.org/javascript/objekte/string.htm
Damit vergleichst du die Werte deines Arrays, wird etwas gefunden, liefert indexOf die Position des Treffers, ansonsten -1.
Freundschaft!
Siechfred
Danke für die Antwort!
Daran habe ich auch schon gedacht, aber da die Überprüfung in einem Alpha-Betha Algorithmus vorkommt, kann ich mir nicht so viele Überprüfungen leisten, dass ich jedes Element des Arrays einzeln mit dem String vergleiche. Diese Überprüfung wird nämlich mehrere 100mal oder 1000mal durchgeführt und würde dabei die Rechenzeit erhöhen.
Ich benötige keine Teiluntersuchung, sondern lediglich die exakte Übereinstimmung zwischen dem String und einem einzigen Feld im Array. Also ob der String im Array enthalten ist oder nicht.
Gruss, manu
Ich benötige keine Teiluntersuchung, sondern lediglich die exakte Übereinstimmung zwischen dem String und einem einzigen Feld im Array. Also ob der String im Array enthalten ist oder nicht.
Was ist eine Teiluntersuchung? Bzw. ist das was anderes als eine exakte Übereinstimmung?
So wie deine Frage klingt, ist die einfachste Möglichkeit für jedes Element durch dein Array iterieren und zu vergleichen.
Oder du machst ein join ('') und prüfst dann mit indexOf
function check(wert, array)
{
var tmp = array.join('');
return tmp.indexOf(wert);
}
Struppi.
Hallo Struppi!
Teiluntersuchung: str ist in string enthalten
Exakte Übereinstimmung: string = string
Entschuldige die unverständliche Ausdrucksweise.
Die Lösung mit Join gefällt mir recht gut. Hast du Erfahrungen, ob das schneller ist, als die Schleife mit Einzelüberprüfungen(s.o.)?
Leider befürchte ich, dass es Probleme gibt, wenn ich als Variable 1 habe und im Array z.B. ne 10 steht :/ Dann würde er das ja als gefunden zurückgeben...
Gruss, manu
Die Lösung mit Join gefällt mir recht gut. Hast du Erfahrungen, ob das schneller ist, als die Schleife mit Einzelüberprüfungen(s.o.)?
Leider befürchte ich, dass es Probleme gibt, wenn ich als Variable 1 habe und im Array z.B. ne 10 steht :/ Dann würde er das ja als gefunden zurückgeben...
so sieht's aus. Was für dich am sinnvollsten ist läßt sich letztendlich nur sagen wenn man weiß wie das Array aussieht und wofür es verwendet wird. Ein assoziatives Array in der Form (nicht wie selfhtml beschrieben, die Benutzung von Array ist nicht zu empfehlen):
var x = new Object();
x['attr_1'] = 1;
x['attr_2'] = 1;
ist auf jeden Fall wesentlich schneller und für viele Zwecke auch die optimale Lösung.
Struppi.
Hallo Manuel.
Daran habe ich auch schon gedacht, aber da die Überprüfung in einem Alpha-Betha Algorithmus vorkommt, kann ich mir nicht so viele Überprüfungen leisten, dass ich jedes Element des Arrays einzeln mit dem String vergleiche. Diese Überprüfung wird nämlich mehrere 100mal oder 1000mal durchgeführt und würde dabei die Rechenzeit erhöhen.
Mag sein, aber mit Javascript kommst du anders nicht zum Ziel. Es sei denn, du wandelst den gesamten Array mit Hilfe von join in einen String um und wendest auf diesen String indexOf an:
http://de.selfhtml.org/javascript/objekte/array.htm#join
Ich benötige keine Teiluntersuchung, sondern lediglich die exakte Übereinstimmung zwischen dem String und einem einzigen Feld im Array. Also ob der String im Array enthalten ist oder nicht.
Dazu musst du aber das Array Element für Element durchgehen, es sei denn, du kennst die Indexnummer des relevanten Elements, dann kannst du natürlich gleich sowas machen:
(dein_array[nummer] == "Dein String") ? return True : return False;
Freundschaft!
Siechfred
Hello,
was hältst Du denn von assoziativen Arrays?
http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays
Da kannst Du dann gleich nachfragen, ob das Element unter diesem Namen angeleget ist und die Suche in der Variablen-Definitionsliste wird von JavaScript selbst vorgenommen.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi Tom!
Bin gerade dabei, mich darin einzulesen. Allerdings befinden sich in meinem einige Zahlen zwischen 1 und 64 und läuft eine Schleife (x=1;x<=64;x++) durch, die prüft, ob der Laufindex x im Array enthalten ist.
Ob dann die Namensgebung für die Arrayfelder sinnvoll ist, weiß ich noch nicht, weil so auch das anlegen des Array aufwendiger wird.
Gruss,manu
gruss Manuel, hi Tom
was hältst Du denn von assoziativen Arrays?
http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arraysDa kannst Du dann gleich nachfragen, ob das Element unter diesem Namen angeleget ist
und die Suche in der Variablen-Definitionsliste wird von JavaScript selbst vorgenommen.Liebe Grüße aus http://www.braunschweig.de
Tom
wenn iteration vermieden werden soll, ist dieser
ansatz der einzig moegliche, gleichzeitig moechte
ich aber einige langlebige missverstaendnisse aus
dem weg raeumen:
"in javascript gibt es keine 'assoziativen arrays'!"
"jedes dennoch im javascript-kontext auftauchende
'assoziative array' wurde brutal vergewaltigt!"
_das_ist_so_ : warum ist das so?
konstrukte der art ...
var assocArr = new Arr();
assocArr["keyName01"] = "something";
assocArr["keyName02"] = "something else";
...
missbrauchen den Array-konstruktor, da hier
offensichtlich "nur" ein einfaches objekt mit ein
paar eigenschaften erzeugt werden soll - weder die
eigenschaft "length" noch die array-methoden, ueber
die ein array-objekt verfuegen kann, werden von einer
solchen chimaere jemals benoetigt - deswegen bitte so:
var simpleObj = new Object();
simpleObj.propName01 = "something";
simpleObj.propName02 = "something else";
oder aber zur dynamischen erzeugung von objekt-eigenschaften
bzw. fuer ehemalige "assoziative straftaeter":
var simpleObj = {}; // {} literal fuer new Object();
simpleObj["propName01"] = "something";
simpleObj["propName02"] = "something else";
oder aber kuerzer als objekt-literal:
var simpleObj = {
propName01: "something",
propName02: "something else"
};
bzw.:
var simpleObj = {
"propName01": "something",
"propName02": "something else"
};
wobei die vorvorletzte und die zuletzt aufgezeigte variante
jeweils die moeglichkeit bieten, namen fuer objekteigenschaften
zu verwenden, welche die namenskonvention fuer variablen verletzen
wuerden (leerzeichen, sonderzeichen etc.);
ende teil 1:
---------
teil 2:
Bin gerade dabei, mich darin einzulesen. Allerdings befinden sich in meinem einige Zahlen
zwischen 1 und 64 und läuft eine Schleife (x=1;x<=64;x++) durch, die prüft, ob der Laufindex
x im Array enthalten ist.
Ob dann die Namensgebung für die Arrayfelder sinnvoll ist, weiß ich noch nicht, weil so auch
das anlegen des Array aufwendiger wird.Gruss,manu
@manu:
nachdem Du teil 1 gelesen hast, sollte dir
folgendes kommentierte beispiel weiterhelfen:
var testStr = "something special";
var testArr = [
1234,
"hi",
9876,
"04",
testStr
];
var keyNames = function() {
var i, obj = {};
for (i=0; i<testArr.length; i++) {
//alle eintraege aus "testArr" werden
//boolsche eigenschaften des objekts
//"obj" mit dem wert [true];
obj[testArr[i].toString()] = true;
}
return obj;
}(); /* keyNames ist jetzt ein objekt
welches zur schnellpruefung auf werte
aus dem array "testArr" herangezogen
werden kann, ohne das fuer jeden test
dieses array erst durchlaufen werden
muss; */
alert("keyNames:\n\n" + ((typeof keyNames.toSource == "function") ? (keyNames.toSource()) : (keyNames)));
function isInTestArr(str) { // schnelltest;
return ((keyNames[str] === true) ? (true) : (false));
}
alert("isInTestArr:\n\n1234 : " + isInTestArr(1234) +
"\n"hi" : " + isInTestArr("hi") + "\n9876 : " +
isInTestArr(9876) + "\n"04" : " + isInTestArr("04") +
"\n"" + testStr + "" : " + isInTestArr(testStr) +
"\n\n"something else" : " + isInTestArr("something else"));
by(t)e by(t)e - peterS. - pseliger@gmx.net
Hello,
danke Peter, das war sehr aufschlussreich und kommt gleich in Doku-Sammlung
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Peter,
gleichzeitig moechte ich aber einige langlebige missverstaendnisse aus dem weg raeumen:
"in javascript gibt es keine 'assoziativen arrays'!"
"jedes dennoch im javascript-kontext auftauchende 'assoziative array' wurde brutal vergewaltigt!"
_das_ist_so_
[...]
Hm, wolltest du die Missverständnisse nicht widerlegen statt sie zu bestätigen ;-)
Freundschaft!
Siechfred
gruss Siechfred,
Hm, wolltest du die Missverständnisse nicht widerlegen
statt sie zu bestätigen ;-)
Du hast recht - also nochmal:
"in javascript gibt es keine 'assoziativen arrays'!" : _das_ist_so_
"jedes dennoch im javascript-kontext auftauchende 'assoziative
array' wurde brutal vergewaltigt!" : _das_ist_ungehoerig_so_
ausserdem moechte ich wortreich darauf aufmerksam machen,
dass ich 'assoziatives array' geschrieben habe, was meine
ablehnende haltung gegenueber diesem begriffe unterstreichen
sollte ;-)
Freundschaft!
Siechfred
mahlzeit - peterS. - pseliger@gmx.net
Hallo Tom.
was hältst Du denn von assoziativen Arrays?
http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays
Meinst du es so:
var mein_array = new Array();
mein_array[0] = new Array();
mein_array[0]["Wert1"] = "Wert 1";
mein_array[0]["Wert2"] = "Wert 2";
mein_array[0]["Wert3"] = "Wert 3";
und dann sowas:
("Wert2" in mein_array) ? return True : Return False;
Das geht nicht, du kannst so nicht auf das Array zugreifen. Was jedoch IMHO gehen sollte, wäre:
(mein_array[0].Wert2) ? return True : return False;
Ist jetzt die Frage, ob es wirklich sinnvoll ist, das vorliegende Array in ein assoziatives Array umzuwandeln, da kann man es auch gleich elementweise durchgehen und vergleichen. Oder man baut sich ein neues Objekt mit den jeweiligen Eigenschaften:
var mein_array {
Wert1 : 'Wert 1',
Wert2 : 'Wert 2',
Wert3 : 'Wert 2'
}
dann geht es auch so:
(mein_array.gesuchterWert) ? return True : return False;
Aber irgendwie erscheint mir das alles zu aufwändig, es sei denn, ich liege wieder mal völlig daneben ;-)
Freundschaft!
Siechfred
hi,
ich würde das so machen, ist glaube ich auch die typische Vorgehensweise.
for(var i=0;i<array.length;i++)
if(array[schleifenindex]==string) return true;
ich hoffe das konnte helfen
-lambach
Hello,
ich würde das so machen, ist glaube ich auch die typische Vorgehensweise.
for(var i=0;i<array.length;i++)
if(array[schleifenindex]==string) return true;
"return" kann man nur zum Verlassen eines Blockes (Funktion) verwenden, nicht aber mitten in einer Sequenz oder Schleifen, wenn der Block (die Funktion, das Programm) noch weiter ausgeführt werden soll.
Liebe Grüße aus http://www.braunschweig.de
Tom