Autor | Zpráva | ||
---|---|---|---|
Honza_n Profil * |
#1 · Zasláno: 21. 7. 2010, 14:43:39
Nevěděl jsem jak to pojmenovat. Vlastně nejde o to uspořádat vlastnosti objektu, ale na základě informací z objektu vrátit pole, které bude uspořádané podle hodnot v těch vlastností. Původní objekt zůstane nedotčený. Nemáte někdo nápad jak to udělat?
Příklad: a = { 2:12, 3:12, 4:12, 5:12, 6:12, 7:12 } metoda by vrátila buď [2,3,4,5,6,7] nebo (druhá možnost) nic, a otestovala by místo toho druhé pole: Nebo b = { 2:0, 3:6, 4:0, 5:6, 6:8, 7:0 } a vrátila by [6,5,3], což jsou názvy indexů, uspořádány sestupně, nula vynechána. |
||
__construct Profil |
#2 · Zasláno: 21. 7. 2010, 15:01:09
Neviem či som Ťa pochopil správne:
a = { 2:12, 3:12, 4:12, 5:12, 6:12, 7:12 }; b = { 2:0, 3:6, 4:0, 5:6, 6:8, 7:0 }; var pole = []; for(var i in a){ if(a[i]== 12){//alebo nejaká iná podmienka pole.push(parseInt(i));//i je string treba ho previesť na int ? } } if(pole.length == 0){//ak je pole prázdne for(var i in b){ if(b[i] != 0) pole.push(parseInt(i));//viz riadok 20 } pole.reverse();//obrátime pole } console.log(pole); |
||
Honza_n Profil * |
#3 · Zasláno: 21. 7. 2010, 15:24:04
__construct:
Asi nechápu co to dělá. Nikde tam nevidím ten uspořádavací proces. Asi by bylo lepší to zkusit nejdříve s spolem b a bez podmínek. Tak aby výsledkem bylo pole [6,5,3] (jsou to názvy vlastností uložené v poli jako hodnoty) |
||
Honza_n Profil * |
#4 · Zasláno: 21. 7. 2010, 15:26:07
Aby jsi mě pochopil správně. To třízení má probíhat podle hodnot těch vlastností pole. To je na tom to nejdůležitější. Ty hodnoty se totiž občas změní, takže uspořádání vlastností pak zase bude jiné, např [3,7,6]
|
||
Honza_n Profil * |
#5 · Zasláno: 21. 7. 2010, 15:28:45
Hodnoty vlastností objektu určují pořadí.
|
||
_es Profil |
#6 · Zasláno: 21. 7. 2010, 15:30:53
Honza_n:
Čo za divné veci to stále vytváraš? Prečo vlastnosti v objektoch pomenúvaš číslami a nepoužiješ namiesto toho normálne pole? Na pole môžeš použiť metódu sort s vlastným definovaním toho, podľa čoho sa má pole zoradiť. |
||
Honza_n Profil * |
#7 · Zasláno: 21. 7. 2010, 15:46:23
_es:
Proč pojmenovávám objekty číslama? Záleží u kterého objektu. V předchozích dotazech jsem rozebíral objekt vzory, kde se jednalo o složitější objekt, který pracoval s číselnými identifikátory. V tomto dotazu rozebírám objekt, který obsahuje pády od 2. až po 7. Pouvažuji o tom, předělat tuto věc do pole. Ale jen zde. |
||
Honza_n Profil * |
#8 · Zasláno: 21. 7. 2010, 15:54:11
_es
Ještě odpovím na tvou otázku proč. Proč na ty pady nepoužiju pole. Protože mi to přijde přehlednější. Kdybych to nadefinoval do pole tak se mi ty indexy posunou o dva a 2 pád by odpovídal 0 a to už začíná být v cyklu nepřehledné. Tedy pády objektu vzory a dalších pomocných objektů zpracovávám pomocí p, kde p = 0 .. 7. 0 je kořen, 1 je první pád. V cyklu se objevují výrazy jako: h[cis][id][p][sid]++; s[cis][id][p]++; s[cis][sum][p]+=s[cis][id][p]+=s[cis][id][p]; Tato logika se mi osvědčila jako přehledná. výrazy s[cis][sum][p+2] už by to činili logicky méně přehledné. |
||
_es Profil |
#9 · Zasláno: 21. 7. 2010, 16:03:35
Honza_n:
„Kdybych to nadefinoval do pole tak se mi ty indexy posunou o dva a 2 pád by odpovídal 0 a to už začíná být v cyklu nepřehledné.“ JS, na rozdiel od niektorých iných programovacích jazykov, umožňuje definovať "riedke" pole, napríklad: a = [ , , 12, 12, 12, 12, 12, 12]; |
||
Honza_n Profil * |
#10 · Zasláno: 21. 7. 2010, 16:07:27
No, jo šlo by to, ale zase se mi to moc nelíbí (asi mám radši ty objekty). To je jedno, hlavní část té funkce už mám hotovou:
function sortMe(obj) { arr = []; if (obj instanceof Object) for (i in obj) if (obj[i]!=0 ) arr.push(obj[i]); arr.sort(); arr.reverse(); return arr; } console.log(sortMe(b)); |
||
_es Profil |
#11 · Zasláno: 21. 7. 2010, 16:11:46 · Upravil/a: _es
Honza_n:
Metóda sort volaná bez parametra zoraďuje textovo - abecedne.
Pre číselné a ďalšie zoradenia treba zadať parameter - funkciu. |
||
Honza_n Profil * |
#12 · Zasláno: 21. 7. 2010, 16:42:55
Tak jsem to vylepší
a = { 2:12, 3:12, 4:12, 5:12, 6:12, 7:12 }; b = { 2:0, 3:6, 4:0, 5:6, 6:8, 7:0 }; function sortMe(obj) { // iniciace if (arguments.length<2) alert("SortMe() - argument 2 není nastaven."); var check = 0; var old = ""; arr = []; if (obj instanceof Object) for (i in obj) { if ( old == obj[i] ) check++; if (obj[i]!=0 ) arr.push(obj[i]); old = obj[i]; } if ( check==5 && arguments[1] instanceof Object ) sortMe(arguments[1],false); arr.sort(); arr.reverse(); return arr; } console.log(sortMe(a,b)); _es: S tou funkcí jako argument, nevím co myslíš, ale toto funguje. |
||
Honza_n Profil * |
#13 · Zasláno: 21. 7. 2010, 16:44:32
Můžete zkusit změnit hodnoty v tom prvním poli např. 11,12,12,12, atd. anebo přehodit pole 'a' a 'b'
|
||
_es Profil |
#14 · Zasláno: 21. 7. 2010, 16:51:19
Honza_n:
„S tou funkcí jako argument, nevím co myslíš, ale toto funguje.“ Myslím ten nepovinný jeden parameter metódy sort , je to popísané v tej dokumentácii, čo som ti dal odkaz.
Aby bolo jasné o čo ide, vyskúšaj si tento JS odkaz (skopírovať do adresového riadku a odenterovať): javascript:alert([10,8,6,4,2].sort()) |
||
Honza_n Profil * |
#15 · Zasláno: 21. 7. 2010, 17:48:33
Jsem si toho všiml až teď že ta funkce stejně nefunguje správně. Výsledkem jsou hodnoty [8,6,6] a ne názvy vlastností [6,3,5]! Tak teď už vůbec nevím jak to dodělat. Když tu funkci sort() rozřížím o uživatelem definovanou funkci tak stejně mohu pracovat pouze s hodnotymi, ale já potřebuju zachovat vazbu mezi číslem původního indexu a původní hodnotou.
V arr.sort(function(a,b){} ); 'a' a 'b' jsou hodnoty, ne názvy indexů... |
||
Honza_n Profil * |
#16 · Zasláno: 21. 7. 2010, 18:21:28
A to je důvod, proč nesnáším pole v JS. Tak zase musím vymýšet jak udělat sort funkci pro objekt.
|
||
_es Profil |
#17 · Zasláno: 21. 7. 2010, 18:23:26
Honza_n:
„'a' a 'b' jsou hodnoty, ne názvy indexů...“ To je predsa jasné, k čomu by bolo zoradenie indexov poľa? "Názvy indexov" je nezmysel. Buď sú indexy poľa - čísla, alebo názvy vlastností objektu - textové reťazce. Ak by si to mal celé nejako normálnejšie, tak by si nemusel vymýšľať také nezmysly. |
||
Honza_n Profil * |
#18 · Zasláno: 21. 7. 2010, 18:37:18
_es:
„Ak by si to mal celé nejako normálnejšie, tak by si nemusel vymýšľať také nezmysly.“ Normálnější - myslíš jako co - kdyby to bylo v poli? Ale ono to je v poli - viz arr.push(obj[i]); Mohl bych to udělat tak, že bych do pole dal objekty, které budou uchovávat ty dvě hodnoty. [ {2:0}, {3:6}, {4:0}, {5:6}, {6:8}, {7:0} ]; A pak to uspořádat. To už by mělo dávat smysl ne? |
||
Nox Profil |
#19 · Zasláno: 21. 7. 2010, 18:40:40
Dle původního zadání nevidim důvod, proč bys nemohl použít prostě obyčejný pole...
|
||
Honza_n Profil * |
#20 · Zasláno: 21. 7. 2010, 18:46:36
Nox:
Jestli si sem přišel až teď - tak protože při sortu pole se ztratí informace o tom, který název vlastnosti je přiřazen ke které hodnotě. Můžeš ti to představit jako tabulku v tabulkovém procesoru nebo tabulku dadabáze, kde sloupce znamenají vlastnost. Nemůžeš libovolně přehazovat hodnoty z jednoho sloupce do druhého - k tomu dojde pokud to dám do pole a seřadím metodou sort. Hodnota 8 je v 6. sloupci a tam taky musí zůstat. Jde o to seřadit řádky (záznamy), změnit jejich pořadí. |
||
_es Profil |
#21 · Zasláno: 21. 7. 2010, 19:01:11
Honza_n:
„To už by mělo dávat smysl ne?“ To by už bolo normálne pole obsahujúce objekty. A ešte väčší zmysel by dávalo, ak by aj tie objekty boli normálnejšie, teda nie s názvami v tvare čísla, ale napríklad: var p = [{index:2, hodnota:0}, {index:3, hodnota:6}, {index:4, hodnota:0}, {index:5, hodnota:6}, {index:6, hodnota:8}, {index:7, hodnota:0}]; p.sort(function(a, b){return a.hodnota - b.hodnota;}); p.sort(function(a, b){return b.hodnota - a.hodnota;}); p.sort(function(a, b){return a.index - b.index;}); p.sort(function(a, b){return b.index - a.index;}); |
||
Honza_n Profil * |
#22 · Zasláno: 22. 7. 2010, 10:38:53
Díky za pomoc, už to je vyřešené. Teda nakonec jsem to udělal tak, že do svého objektu jsem vytvořil dočasné pole temp_arr do kterého jsem uložil hodnoty tak jak jsme to tu probrali. Pak jsem vytvořil funkci, ve které to třídím a pak to převádím zpět na objekt, aby se mi s tím lépe pracovalo (aby to bylo přehledné). S výsledkem jsem spokojen.
|
||
Časová prodleva: 14 let
|
0