Autor Zpráva
IdemeNaHavaj
Profil
Ahoj.
Mám niečo takéto
            if(sprava.indexOf("ako sa mas") !== -1){
              API.sendChat("@"+odkoho+" "+odpovede_AkoSaMas[nahodneCislo]);
            } else if(sprava.indexOf("co robis") !== -1){
              API.sendChat("@"+odkoho+" "+odpovede_CoRobis[nahodneCislo]);
            } else if(sprava.indexOf("ako sa volas") !== -1){
              API.sendChat("@"+odkoho+" "+odpovede_AkoSaVolas[nahodneCislo]);

a aby som nemusel dávať furt else if tak ma napadlo či sa nedá dať rovno jedna podmienka
niečo ako sprava.indexOf(nejakyArray) a v tom nejakyArray by boli všetky tie stringy ako sa mas, co robis, ako sa volas atď?
Kubo2
Profil
IdemeNaHavaj:
Myslím, že také niečo nie je (opravte ma prosím, ak sa mýlim), ale dá sa to jednoducho implementovať.
String.prototype.indexOfArray = function(stringList) {
  var matches = [];
  for(var i in stringList) {
    matches[i] = this.indexOf(stringList[i]);
  }
  return matches;
}

Edit:
Funkciu som komplet zjednodušil, vzápätí, hneď na to, ako som sa pozrel do spätného zrkadielka na svoj príspevok, objavil som vo svojom kóde kopu hlúpostí a zbytočností :-)
IdemeNaHavaj
Profil
Kubo2:
a ako to použijem? stringList je ten array so stringami?
Kubo2
Profil
IdemeNaHavaj:
a ako to použijem?
Myslel som si, že sa spýtaš :-)
// tvoje reťazce
var stringy   =   ["Havaj", "diskutér", "Diskuse", "s"];

// vráti to pole s indexami stringov v tvojom poli stringy, ale len tie, ktoré boli nájdené
var indexy = "IdemeNaHavaj je diskutér na Diskusi JPW.".indexOfArray(stringy);

if (indexy[0] != -1) {
  // ak bol string v poli stringov nájdený
  // vráti na danom indexe aj pozíciu stringu
  // indexy[i] je pozícia reťazca stringy[i]
}
V podstate to testuješ tak isto, akurát tam máš polia, a nepotrebuješ to robiť samostatne.

stringList je ten array so stringami?
Áno. to je on. Ten array alebo to array? Nad array som radšej neuvažoval.


IdemeNaHavaj:
Ale ak chceš robiť niečo takéto s výsledkom tej funkcie
// ...
for(var index in stringy) {
  if (matches[index] !== -1) {
    // .. kód
  }
}
tak sa na to vykašli, kľudne to môžeš urobiť oveľa jednoduchšie a nemusíš zasahovať do prototypu stringu.
var seno = "Reťazec, v ktorom sa budú hľadať sub-reťazce.", stringy = [...];
for(var index in stringy) {
  if(seno.indexOf(stringy[index]) !== -1) {
    // ... kód
  }
}
Vo svojej podstate to je to isté, takže je jedno, pre ktorý z uvedených spôsobov sa rozhodneš.
Chamurappi
Profil
Reaguji na IdemeNaHavaje:
aby som nemusel dávať furt else if tak ma napadlo či sa nedá dať rovno jedna podmienka
V každé větvi děláš něco jiného, to sjednotíš jak?

Upravit hledání, aby se hledalo jen jednou, jde třeba s pomocí regulárních výrazů:
if(/ako sa mas|co robis|ako sa volas/.test(sprava)) { … }
Nebo:
if(sprava.search(/ako sa mas|co robis|ako sa volas/) != -1) { … }
Jenže ty asi potřebuješ i zjistit, co se našlo. Šlo by tedy udělat třeba:
var m = sprava.match(/(ako sa mas)|(co robis)|(ako sa volas)/);
… buď bude m rovno null, nebo bude jedno z m[1], m[2] či m[3] neprázdné. Ale u else if asi stejně skončíš, protože potřebuješ provádět různé věci (alespoň dle tebou uvedeného kódu). Musel bys ty různé věci nějak učesat, aby nebyly tak moc různé.


Reaguji na Kuba2:
objavil som vo svojom kóde kopu hlúpostí a zbytočností
To bylo o fous, už jsem si na tom chtěl smlsnout :-)
Ale stejně si smlsnu na tom, že používáš for-in na pole.

Jinak bych řekl, že řešíš universálně hledání pozice v řetězci, zatímco IdemeNaHavaj potřebuje ověřit vlastně jen přítomnost podřetězce v řetězci. Kde přesně je, to už neřeší…
IdemeNaHavaj
Profil
Kubo2, Chamurappi:
Hej potrebujem aj že nech sa vykoná tá akcia, ku ktorému sa to práve našlo
Kubo2
Profil
Chamurappi:
Ale stejně si smlsnu na tom, že používáš for-in na pole
Síce na tom nevidím nič zlé, ale pre istotu sa spýtam: je na to niečo iné (poprípade lepšie)?
Viem, že ty si v JS macher, tak hádam mi poradíš :-)

IdemeNaHavaj:
Hej potrebujem aj že nech sa vykoná tá akcia, ku ktorému sa to práve našlo.
Môžeš si vytvoriť pole funkcí (polí?) s rovnakými indexmi ako stringy a potom to testovať:
// deklarovanie premenných
var stringy = ["ako sa mas", "co robis", "ako sa volas"], funkcie = [odpovede_AkoSaMas, odpovede_CoRobis, odpovede_AkoSaVolas];

// prejdenie cyklom
for(var i = 0; i < stringy.length; i++) {
  if(sprava.indexOf(stringy[i]) !== -1) {
    API.sendChat("@"+odkoho+" "+funkcie[i][nahodneCislo]);
    break;
  }
}
1Pupik1989
Profil
Já bych to viděl asi následovně:

function ExpressionInString(string,callbacks,onerror){
  for(var i in callbacks){
    if(string.indexOf(i) !== -1){ callbacks[i](i); return true; }
  }
  
  if(typeof onerror == 'function'){
    onerror();
  }
  
  return false;
};


var text = 'Ahoj, jak jsem Franta a mam se blbe.';
var text1 = 'Ahoj, jak jsem Franta a mam se dobre.';
var text2 = 'Ahoj, jak jsem Franta a nemam se nijak.';

var callbacks = {
  'mam se dobre':function(){
    alert('Asi se má dobře');
  },
  'mam se blbe':function(match){
    alert('Má se špatně');
  }
};


var onerror = function(){
  alert('Nenalezen shodný výraz');
};


ExpressionInString(text,callbacks,onerror);
ExpressionInString(text1,callbacks,onerror); 
ExpressionInString(text2,callbacks,onerror); 
IdemeNaHavaj
Profil
1Pupik1989:
prečo je na riadku 22 vo funkcí match?
1Pupik1989
Profil
IdemeNaHavaj: Protože jsem ho zapomněl smazat. A callback taky není třeba volat s parametrem i.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0