Autor Zpráva
mireček
Profil *
Zdravím,
chtěl bych se zeptat jak přidat do objektu vlastnost length? Tedy tak, aby se objekt choval podobně jako pole. Do pole když přidám prvek, tak se mi navýší vlastnost length. Chtěl bych navýšit length když do objektu přidám vlastnost. Abych byl konkrétnější, jde o to, že vytvářím objekt z jiného objektu pomocí funkce clone:

function clone(obj, func) { // func není povinný
  var newObj = (obj instanceof Array) ? [] : {};
  if (func)
  for (var i in obj) {
    if (func(i)==true){
      if (obj[i] && typeof obj[i] == "object") {
        newObj[i] = clone(obj[i]); // recursion!
      } else newObj[i] = obj[i]
    } // dodatečná funkce pro kontrolu názvu vlastnosti 
  }
  else
  for (var i in obj) {
    if (obj[i] && typeof obj[i] == "object") {
      newObj[i] = clone(obj[i]); // recursion!
    } else newObj[i] = obj[i]
  }   
  return newObj;
};


A v tom nově vytvořeném objektu bych chtěl vědět, kolik je tam vlastností (výjma vlastnosti length). Tuším, že by se to snad mělo udělat pomocí prototypu a konstruktoru, aby length nebylo zpracovatelné cyklem for.
aichi
Profil *
tak zásadní problém je, že pole procházíš pomocí for-in cyklu a ne pomocí for cyklu. Protože pole nemá žádné vlastnosti, které bys měl klonovat, pouze hodnoty pod klíči. Pokud tyto hodnoty cyklem zkopíruješ, pak se ti length samo upraví.
mireček
Profil *
aichi:
Asi ti nerozumím. Nepracuji s polem, ale s objektem. To pole jsem uvedl jen jako příklad, jak pracuje pole. Fakt ale je, že mám objekt, který potřebuju zpracovat pomocí funkce clone. Při tom má vzniknout nový objekt, s vlastností length. Takže ne pole. Mě by vážně zajímalo jak tuto věc vyřešit. Zvlášť když si uvědomíme, že pole je v podstatě objekt.... Předně bych rád odpověď na svou otázku, ale ...

Z principu toho, jak v JS pracují objekty si myslím, že array je v podstatě objekt (nebo dokonce prototyp) se skrytými vlastnostmi, ne? Čistě teoreticky Array by měl mít nějaký vlastní konstruktor a vlastnost (objekt), do které ukládá hodnoty... si teda aspoň myslím...
mireček
Profil *
aichi:
Teda proč si to myslím, protože kdyby měl Array fungovat tak jak si to popsal, tak jakou by měl jako objekt strukturu? Takovou?
{
'0':'hodnota',
'1':'hodnota',
'2':'hodnota',
'3':'hodnota',
další hodnoty...
'length':hodnota
}

To asi ne? To by bylo nelogický. Spíše
{
values:['hodnota', 'hodnota', 'hodnota', 'hodnota',...].
indexes:[0, 1, 2, 3,...],
length:hodnota
}

Si teda aspoň myslím já, zatím je to jen takové hádání...
_es
Profil
mireček:
Aký veľký úžitok môže mať informácia o počte vlastností v objekte?
A vlastnosti z prototypov tam zarátať alebo nezarátať?
Prácu s objektami vylepšuje nový ECMA script verzia 5, no podpora je len čiastočná a aj to len v najnovších prehliadačoch.
Napríklad tento dotaz, no tých vylepšení je oveľa viac.
mireček
Profil *
_es:
Aký veľký úžitok môže mať informácia o počte vlastností v objekte?

Abych ten objekt mohl zpracovat ve smyčce. Normálně by to šlo udělat pomocí for in smyčky, ale mám odlišnou situaci.

Tedy situace je taková. Potřeboval bych to zpracovat takovýmto způsobem

for (var n in myObj){
 if ( podmínka ) limit=1; 
   else if (podmínka) limit=myObj[n].length;
 for (var c =0; c<limit ;c++ )
 {
 // hlavní část kódu ke zpracování je zde
 }
}
_es
Profil
mireček:
Abych ten objekt mohl zpracovat ve smyčce.
A ako k tým vlastnostiam v tej slučke budeš pristupovať, ak tie vlastnosti nie sú očíslované a teda ani nie je určené ich poradie?
mireček
Profil *
_es:
A ako k tým vlastnostiam v tej slučke budeš pristupovať, ak tie vlastnosti nie sú očíslované a teda ani nie je určené ich poradie?

Na to jsem nepomyslel. Moje teorie má trhlinu.
mireček
Profil *
Je vůbec nějaký způsob jak použít cyklus "for .. in .." nebo něco podobného, ale podmínit to, aby se za určitých okolností provedl jen jeden cyklus?

Uvnitř toho cyklu je delší kód, který potřebuju provést a vyhodnotit. To vše je vsazené do dalších dvou cyklů. V podstatě jde o to provést ten kód buď ve dvou cyklech nebo ve třech cyklech. Přece to nebudu rozdělovat do dvou částí takto:

if (..){
  for .. in ... for .. in { ...hlavní blok kódu... }
}
else
{
  for .. in  for .. in ... for .. in { ...ten samý hlavní blok kódu... }
}

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