Autor Zpráva
Honza_n
Profil *
V manuálu jsem četl:
You can use the delete operator to delete variables declared implicitly but not those declared with the var or the function statement.

Mám dvě pole. To první pole se jmenuje "vzory" a je to originál. "vzory_" je pouhá kopie jeho části.
Vzory z čarou vytvářím takto:

var vzory, vzory_;
function nastav_vzory() {
vzory_ = vzory[druh][zkratka];
}


Ještě uvádím kousek z pole vzory:
var vzory;
vzory = {
            "mz1":{
               "1": ["p", "án", "ána", "ánovi,u", "ána", "ane", "ánovi,u", "ánem"]
               }
            }
        };



Mám funkci filtrujVzory, ve které v cyklu provádím smazání některých vlastností ze vzory_
function filtrujVzory(){
for (var k in vzory_) delete vzory_[k];
}


Četl jsem tu větu z manuálu nechápu co dělám špatně. vzory a vzory_ přece deklaruju mimo funkci. Přesto, když se pokouším vymazat vlastnosti ze vzory_ nakonec zjistím, že jsou vymazány v původním objektu! tj ve vzory.

Poradí někdo?
Honza_n
Profil *
Oprava toho pole

var vzory;
vzory = {
      "poj":{
            "mz1":{
               "1": ["p", "án", "ána", "ánovi,u", "ána", "ane", "ánovi,u", "ánem"]
                   }
            }
        };


pozn. vzory_ odkazuje na objekt vzory.poj
ah01
Profil
Honza_n:
pozn. vzory_ odkazuje na objekt vzory.poj
Správně, odkazuje, nejedná se o kopii, jak píšeš nahoře. Tedy je jasné, že pokud něco smažeš v vzory_, smažeš to zároveň i v vzory[druh][zkratka].
Honza_n
Profil *
ah01:
A jak to mám udělat, abych z toho vzory.poj vytvořil kopii? Abych mohl pracoval přímo s kopií a originál zůstal nedotčen.
Honza_n
Profil *
Kopírování objektů, vyřešeno.
Odkaz
ah01
Profil
Honza_n:
Drobné upozornění. Pokud si rozšíříš prototype Objectu a použiješ for...in, možná tě překvapí, že tam najdeš vlastnost clone, viz následující příklad:

Object.prototype.clone = function () {…};

var data = {"jedna": 1,  "dve": 2};
for (var i in data) alert(i); // postupně zobrazí "jedna", "dve" a "clone"


Pokud tě zajímá jen to "jedna" a "dve" z ukázky, musíš od chvíle, kdy šáhneš na Object.protptype, všude psát for...in takto:

for (var i in data) {
  if (!data.hasOwnProperty(i)) continue;
  
  alert(i);
}
Honza_n
Profil *
Tam už nějaké ošetření je zabudované:

if (i == "clone") continue;


.clone() mi funguje, zatím jsem nenarazil na problém.
Honza_n
Profil *
ah01:
Už ti rozumím. Myslíš, pokud si vytvořím nějaký libovolný objekt bez toho, že bych ho kopíroval pomocí clone(). Všechny objekty mají zabudovanou metodu .clone() a tím pádem, když zpracovávám cyklus libovolného objektu narazím na to "clone". Zrovna se mi to stalo.

Původní kód
var pady_ = {};
n = ["sg", "pl"]; p = [1,2,3,4,5,6,7]; v = [1, 2];

for (a in n)
    for (b in p)
      for (c in v) {
	pady_[a+b+c] = $("input[name="+a+b+c+"]","fieldset#koncovky").val();}


Opravený kód:
var pady_ = {};
n = ["sg", "pl"]; p = [1,2,3,4,5,6,7]; v = [1, 2];
  for (a in n){
    if (!n.hasOwnProperty(a)) continue;
    for (b in p){
      if (!p.hasOwnProperty(b)) continue;
      for (c in v){ 
        if (!v.hasOwnProperty(c)) continue;      
        pady_[a+b+c] = $("input[name="+a+b+c+"]","fieldset#koncovky").val(); 
        console.log("input[name="+a+b+c+"]");
}}}
console.log(pady_);


Jenom mi není jasné, proč ta metoda nerozpozná "clone" jako vlastnost. Vždyť to je přece taky vlastnost?
ah01
Profil
Honza_n:
Jenom mi není jasné, proč ta metoda nerozpozná "clone" jako vlastnost. Vždyť to je přece taky vlastnost?

Every object descended from Object inherits the hasOwnProperty method. This method can be used to determine whether an object has the specified property as a direct property of that object; unlike the in operator, this method does not check down the object's prototype chain.“ – hasOwnProperty na MDC
Honza_n
Profil *
A co to je ten "prototype chain"?

Jinak v souvislosti s tím objektem (objekt pady - obsahuje inputy koncovek pádů) řeším ještě jeden problém. Mám ten objekt deklarovaný vně funkce, takže by to mělo být jako globální proměnná. Pak z funkce
function nastav_vzory(pady)
spouštím ten kód výše (14:37:53 - + malá oprava n[a]+p[b]+v[c] místo a+b+c).

Problém je v tom, že vždy když spouštím function nastav_vzory(pady) se mi ten objekt pokaždé vynuluje. Myslel jsem, že když dam ten objekt jako argument tak se to snad vyřeší, ale nic se nestalo. Jde mi o to, že nechci při každém kliknutí na tlačítko (tj. volání té funkce) spouštět cyklus.

Mám tam tedy tento kód:
 if (pady instanceof Object === false)

a pak následuje cyklus. Nicméně jak říkám, vždy se ten objekt "pady" vynuluje. Tím pádem raději se ptam, jestli u těch objektů ještě není nějaká záludnost, o které nevím nebo jsem něco přehlédl?
Honza_n
Profil *
Lidi, co to čtete, aspoň napište jestli si myslíte jestli nějakou chybu vidíte nebo ne, protože já už nevím kde ji mám hledat. Zakládat novou diskusi (dotaz) kvůli tomuto snad nemá cenu.
Honza_n
Profil *
ah01:
for (var i in data) {
if (!data.hasOwnProperty(i)) continue;
>
alert(i);
}

Teď jsem zjistil, že ta metoda na kopírování objektů moc nejde dohromady s Jquery. Ten cyklus for .. in se vyskytuje i v Jquery, tak to by se tam s tímto muselo počítat. Teda nevím jestli Jquery umí kopírovat objekty, vím, že zvládá jen kopírování elementů pomocí clone(). A tak si říkám, že kdyby tvůrci chtěli, tak by se to dalo vyřešit aby cykly přeskakovaly ty vlastnosti, které by uživatel specifikoval v poli.
Chamurappi
Profil
Reaguji na Honzu_n:
Teď jsem zjistil, že ta metoda na kopírování objektů moc nejde dohromady s Jquery.
Ne, to už jsi zjistil minulý týden.

Nechápu, proč se tak urputně snažíš nalepit tu funkci na všechny objekty. To je tak nepříjemné používat normální funkci a předat jí to, co má kopírovat, jako argument?
Honza_n
Profil *
Chamurappi:
No, Chamurappi, uzas a zas na to narážím a tak si říkám, že je to fakt blbost cpát do každého cyklu vyjímku kvůli prototypu. Takže máš pravdu, od teď už budu používat jenom funkce.
Honza_n
Profil *
Kdyby někdo chtěl ten kód
function clone(obj) {
  var newObj = (obj instanceof Array) ? [] : {};
  for (i in obj) {
    if (i == "clone") continue;
    if (obj[i] && typeof obj[i] == "object") {
      newObj[i] = clone(obj[i]); // recursion!
    } else newObj[i] = obj[i]
  }   
  return newObj;
};

4. řádek je asi zbytečnej (pozůstatek z prototypu) ale nejsem si jistý zda ho smím vymazat.

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