Avatar
matesax
Redaktor
Avatar
matesax:

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
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

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í a s b

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

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

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
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

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
Redaktor
Avatar
Odpovídá na Drahomír Hanák
matesax:

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

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

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

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

Nahoru Odpovědět 2.12.2012 21:50
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

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
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Kit
Drahomír Hanák:

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
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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
Redaktor
Avatar
Odpovídá na Drahomír Hanák
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
matesax:

Tedy funkcí - lambda funkcí.

 
Nahoru Odpovědět 2.12.2012 22:10
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

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
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Kit:

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  +1 2.12.2012 22:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Kit:

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.