Autor | Zpráva | ||
---|---|---|---|
mireček Profil * |
#1 · Zasláno: 20. 9. 2010, 11:32:49
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 * |
#2 · Zasláno: 20. 9. 2010, 15:43:14
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 * |
#3 · Zasláno: 20. 9. 2010, 16:09:35
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 * |
#4 · Zasláno: 20. 9. 2010, 16:14:43
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 |
#5 · Zasláno: 20. 9. 2010, 18:42:22
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 * |
#6 · Zasláno: 20. 9. 2010, 18:57:24
_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 |
#7 · Zasláno: 20. 9. 2010, 20:47:06
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 * |
#8 · Zasláno: 20. 9. 2010, 21:14:21
_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 * |
#9 · Zasláno: 20. 9. 2010, 21:29:30
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... } } |
||
Časová prodleva: 14 let
|
0