Autor Zpráva
Leo3
Profil
JSON mi zo servera vrati taketo pole (vypis z js konzoly):
Object {jablko: "", hruska: "mozno", ananas: "ano", slivka: "ine"...}

No a na strane klienta potrebujem zistit, ci nejake ovocie ma hodnotu "ano". Ako to spravim?
Skusal som pouzit fciu jQuery.inArray(), no nefunguje. Zakazdym vracia -1.
if (jQuery.inArray("ano", poleOvocie) != "-1") {
  console.log("JS: \"ano\" sa nachadza.");
} else {
  console.log("JS: \"ano\" sa nenachadza.");
}

Tu to pekne funguje.
Keeehi
Profil
Leo3:
Skusal som pouzit fciu jQuery.inArray(), no nefunguje.
To bude tím, že to není pole ale objekt. Tudíž například zda ananas má hodnotu "ano" zjistíš
if(poleOvocie.ananas == "ano")
SirDoxik
Profil
Udělal bych to takhle:
var obj = { one:1, two:2, three:3, four:4, five:5 };
var ovoce = false;

jQuery.each(obj, function(i, val) {
  if(val == "ano")
  {
      console.log("JS: \"ano\" sa nachadza.");
  }
});
if(ovoce == false)
{
   console.log("JS: \"ano\" sa nenachadza.");
}
  
  
  
Leo3
Profil
SirDoxik:
Podla tohto je i index a val value. Nechapal som co je to, tak som si to tam kukol.

Inak v tom priklade chyba v podmienke if(val == "ano") nastavenie ovoce = true;

Teda takto mi to funguje:
poleOvocie = {jablko: "", hruska: "mozno", ananas: "ano", slivka: "ine"};
var ovoce = false;
 
jQuery.each(poleOvocie, function(i, val) {
  if(val === "ano")
  {
      console.log("JS: \"ano\" sa nachadza.");
      ovoce = true;
  }
});
if(ovoce === false)
{
   console.log("JS: \"ano\" sa nenachadza.");
}

Dakujem za pomoc.
Keeehi
Profil
Funkci inObject jsem vytvořil, aby fungovala podobně jako inArray. Jen místo čísla indexu vrací jméno atributu a pokud nic nenajde tak místo -1 vrací false. Navíc neprasí své okolí žádnými pomocnými proměnnými.
function inObject(value, object) {
    for (var property in object) {
        if (object[property] === value) {
            return property;
        }
    }
    return false;
}

var poleOvocie = {jablko: "", hruska: "mozno", ananas: "ano", slivka: "ine"};

console.log(inObject("ano", poleOvocie));
Leo3
Profil
Velmi zaujimave riesenie. Paci sa mi, ze nepotrebuje jQuery.

Na priklade od SirDoxik mi vyhovuje, ze mozem hladat naraz viacere prvky.
poleOvocie = {jablko: "", hruska: "mozno", ananas: "ano", slivka: "nie"};
var foundAno = false;
var foundMozno = false;
var foundNie = false;
 
jQuery.each(poleOvocie, function(i, val) {
  if (val === "ano")
  {
      foundAno = true;
  }
  if (val === "mozno")
  {
      foundMozno = true;
  }
  if (val === "nie")
  {
      foundNie = true;
  }  
});

Tvoje riesenie by stacilo s navratovou hodnotou true.
poleOvocie = {jablko: "", hruska: "mozno", ananas: "ano", slivka: "nie"};
function inObject(value, object) {
    for (var property in object) {
        if (object[property] === value) {
            return true;
        }
    }
    return false;
}

var foundAno = inObject("ano", poleOvocie);
var foundMozno = inObject("mozno", poleOvocie);
var foundNie = inObject("nie", poleOvocie);
Zda sa mi toto krajsie riesenie.
Otazka znie, ktore riesenie je rychlejsie?
Keeehi
Profil
Leo3:
Otazka znie, ktore riesenie je rychlejsie?
Asymptoticky jsou na tom stejně. Složitost obou je O(n). První možnost je datově necitlivá (je jí jedno, jaká data ji předáš) a vždy udělá n kroků. Druhá možnost je datově závislá a udělá nějakých 6 kroků v nejlepším případě a 3n v nejhorším případě.

Pokud má ten objekt třeba tisíc prvků, nemá cenu se rychlostí vůbec zabývat. Pokud by jich měl miliardu, pak by to mohlo stát za to. Vždy bude ale potřeba testovat na reálných datech.
Leo3
Profil
V prvom pripade prechadza cele pole. Aj ked najde zhodu, tak prechadza dalej az do konca pola.

V druhom pripade prechadza pole a ked najde prvu zhodu, tak skonci. Cize by mal byt rychlejsi.

Keby bolo treba zistit pocet vyskytov hladaneho prvku, tak je vhodnejsia prva varianta.
Keeehi
Profil
Leo3:
V druhom pripade prechadza pole a ked najde prvu zhodu, tak skonci. Cize by mal byt rychlejsi.
Při jednom hledaném prvku ano, při třech už to být pravda nemusí. Pokud tam ani jeden prvek nebude, tak se projdou všechny prvky třikrát, u prvního jen jednou.

Nicméně, má to spoustu ale:
- pokud budou prvky unikátní a náhodné, pak první varianta jich projde n a druhá v průměru 1.5*n
- kód vnitřního cyklu první varianty je složitější než kód druhé varianty, je tedy o nějakou konstantu k, k-krát pomalejší.
- v prvním případě se n-krát volá funkce, což bude zase pomalejší, jelikož se v kódu musí skákat.
- nejspíš bude i záležet na implementaci javascriptu prohlížečem
=> Kvůli těmto ale se nedá obecně říci, co bude rychlejší. Pokud něco, tak je třeba to otestovat na reálných datech. Jde však o to, zda je vůbec potřeba to řešit. I kdyby jedna varianta byla desetkrát pomalejší než ta druhá, tak pokud budeš vyhledávat v souboru o deseti prvcích, pak to bude úplně jedno.

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: