Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:2.12.2012 21:25

Dobrý den,
mám v JS pole [[], [],...] přičemž každé podpole má 3 itemy a já bych potřeboval seřadit hlavní pole podle druhé položky subarraye. Array sort má, ale jak bude vypadat funkce pro něj? Děkuji.

Editováno 2.12.2012 21:25
 
Odpovědět
2.12.2012 21:25
Avatar
Odpovídá na matesax
Drahomír Hanák:2.12.2012 21:40

Jednoduše použiješ callback jako parametr metody sort.

var pole = [[5, 2, 6], [89, 3, 5], [1, 1, 0]];
var serazeno = pole.sort(function(a, b) {
   return a[1]-b[1];
});

Mimochodem, výsledek callbacku:

  • 1 (resp. záporný): prohodí <strong>a</strong> s <strong>b</strong>

0: stejné hodnoty = neprohodí
+1 (resp. kladný): prohodí <strong>b</strong> za <strong>a</strong>

Editováno 2.12.2012 21:44
 
Nahoru Odpovědět
2.12.2012 21:40
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
matesax:2.12.2012 21:44

Děkuji - vysvětlil jsi mi to dokonale. Super! :) (Takže to stejně probíhá v cyklu. :()

Editováno 2.12.2012 21:46
 
Nahoru Odpovědět
2.12.2012 21:44
Avatar
Odpovídá na matesax
Drahomír Hanák:2.12.2012 21:46

Je to řazeno od nejmenšího po největší podle druhé položky vnořeného pole. Proč to tak je jsem doplnil do původního příspěvku ;)

 
Nahoru Odpovědět
2.12.2012 21:46
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
matesax:2.12.2012 21:48

Takže já chci b[1] - a[1]?

 
Nahoru Odpovědět
2.12.2012 21:48
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
Kit:2.12.2012 21:49

Prohodit a s b a prohodit b za a je totéž. Ale jinak je to OK.

Parametry a a b jsou vždy naplněny hodnotami, u kterých sort() potřebuje zjistit, co je větší.

Anonymní funkce jsou prostě kouzelné :)

Editováno 2.12.2012 21:51
Nahoru Odpovědět
2.12.2012 21:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:2.12.2012 21:50

Zrovna o nich píšu článek pro C# :)

Nahoru Odpovědět
2.12.2012 21:50
New kid back on the block with a R.I.P
Avatar
Odpovídá na matesax
Drahomír Hanák:2.12.2012 21:52

Přesně. Teda pokud to chceš řadit od největší položky po nejmenší. Pak jsi to pochopil dobře :)

 
Nahoru Odpovědět
2.12.2012 21:52
Avatar
Odpovídá na Kit
Drahomír Hanák:2.12.2012 21:53

Jo, taky jsem si to pak uvědomil, ale snad to bude jasné, když je to pod tím naopak :)

Editováno 2.12.2012 21:54
 
Nahoru Odpovědět
2.12.2012 21:53
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:2.12.2012 21:56

Na anonymní funkce jsem poprvé narazil v Lispu a byl jsem velmi potěšen, že se dostaly i do Pythonu. Je to jednoduchý způsob, jak aplikovat DI a neztratit přitom orientaci v programu.

Nahoru Odpovědět
2.12.2012 21:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
matesax:2.12.2012 22:04

Jaká je vůbec správná definice lambda výrazů? Na internetu jsou velké rozpory.

Editováno 2.12.2012 22:06
 
Nahoru Odpovědět
2.12.2012 22:04
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:2.12.2012 22:10

Tedy funkcí - lambda funkcí.

 
Nahoru Odpovědět
2.12.2012 22:10
Avatar
Odpovídá na matesax
Drahomír Hanák:2.12.2012 22:34

Teď nevím, co myslíš. Funkci můžeš definovat jedině pomocí klíčového slova function, přičemž ji můžeš a nemusíš dávat jméno případně ji můžeš uložit do proměnné. Následující zápisy jsou v JS ekvivalentní:

var hello = new Function("return 'word'");
var hello = function(){ return 'world'; };
function hello() { return 'world' };

Z těch možností můžeš používat kteroukoli snad kromě první. Tu bych raději nepoužíval.

Funkce si můžeš nechat předávat do parametrů a spouštět. Spouštění funkcí v JS jde taky několika způsoby:

hello();
hello.call(kontext, parametr1, parametr2);
hello.apply(kontext, [parametr1, parametr2]);

Funkci lze dokonce hned zavolat. Stačí ji obalit závorkami, aby bylo jasné, co voláš:

(function(message) {
  console.log(message);
})('Hello world');

Tím, že je můžeš mít v proměnné, se dají taky hezky předávat jako parametry. Např. pro různé události, které se mají vykonat (např. po načtení AJAX požadavku, po skončení animace apod.)

 
Nahoru Odpovědět
2.12.2012 22:34
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
Kit:2.12.2012 22:59

Ty zápisy funkcí nejsou zcela ekvivalentní. Každá se chová trochu jinak. Dokonce funguje i podivná konstrukce

var hello = function hello2(){ return 'world'; };

Tato funkce má pak 2 jména. Funkce hello2() je v navazujícím kódu nedostupná, ale je možné ji použít k rekurzi z funkce hello().

Nahoru Odpovědět
2.12.2012 22:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
Kit:2.12.2012 23:05

Pokud funkci definuji pomocí

var hello = function(){ return 'world'; };

je před touto definicí nedostupná a může být za běhu redefinována jinou funkcí se stejným názvem. To u klasické deklarace funkce není možné, je platná v celém skriptu.

Nahoru Odpovědět
2.12.2012 23:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.