Autor Zpráva
Honza_n
Profil *
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
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 *
__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 *
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 *
Hodnoty vlastností objektu určují pořadí.
_es
Profil
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 *
_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 *
_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
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 *
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
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 *
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 *
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
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 *
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 *
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
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 *
_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
Dle původního zadání nevidim důvod, proč bys nemohl použít prostě obyčejný pole...
Honza_n
Profil *
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
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}];
A potom zoradenie poľa podľa hodnoty vzostupne:
p.sort(function(a, b){return a.hodnota - b.hodnota;});
Zoradenie poľa podľa hodnoty zostupne:
p.sort(function(a, b){return b.hodnota - a.hodnota;});
Zoradenie poľa podľa indexu vzostupne:
p.sort(function(a, b){return a.index - b.index;});
Zoradenie poľa podľa indexu zostupne:
p.sort(function(a, b){return b.index - a.index;});
Honza_n
Profil *
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.

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