Problémy s JavaScript v praxi

oss

Re:Problémy s JavaScript v praxi
« Odpověď #105 kdy: 27. 09. 2018, 19:35:35 »
Na porovnani identity objektu mas operator ===. Na porovnani obsahu objektu mas ==, ale v JS je spatne implementovan. Ale tak hlavne ze porovnava cislo se stringem.
Co mi napíše java nebo c# na (volná syntaxe)?:

var x = new object(bla bla bla);
var y = new object(bla bla bla);
(x == y)


taky false, protože neporovnává obsah, ale zda jde o totožný objekt (stejně jako v JS).

=== to nevylepší, protože k předchozímu jen přidá porovnání typu proměnné (zde object).

Proto java i c# na skutečné porovnání obsahu používá .equals() které JS nemá, ale není problém si ho přidat z nějaké knihovny nebo dopsat (anebo použít to výše uvedené porovnání objektů převedených na JSON stringy) .

V C# to zalezi a tom ci si pretazil operator ==.


BoneFlute

  • *****
  • 2 003
    • Zobrazit profil
Re:Problémy s JavaScript v praxi
« Odpověď #106 kdy: 27. 09. 2018, 20:13:09 »
Jinak je samozřejmě k dispozici for, for in a for of.

Tak já jsem narážel na `for .. of` a je vidět, že mi to uteklo. Díky za doplnění.

Kit

Re:Problémy s JavaScript v praxi
« Odpověď #107 kdy: 27. 09. 2018, 20:29:46 »
[1,2,3,15,30,7,5,45,60].sort((a, b) => (a - b));
To je k bliti, rovnak na ohybak.

Pokud ti někdo řekne, že musíš povinně uvést porovnávací funkci, tak to zas tak hrozné není. Tímto způsobem můžeš řadit podle libovolného atributu objektů v kolekci.

Neinformovaný

Re:Problémy s JavaScript v praxi
« Odpověď #108 kdy: 27. 09. 2018, 21:33:09 »
Ten váš sort() je jedno z mála WTF, co moderní JS má. V PHP jich je mnohem víc a k pořádný práci je potřeba hodně knihoven.

Např. mě každej den vytáčí, že číslo/řetězec/pole neni objekt, takže nemůžu pěkně přehledně zavolat arr.filter(..).map(..) ale musim volání do sebe nepřehledně zanořit nebo několikrát za sebou přiřadit.

Jano7

Re:Problémy s JavaScript v praxi
« Odpověď #109 kdy: 27. 09. 2018, 22:16:01 »
Populárna knižnica Ramda to má vyriešené tak, že je nutné zadať komparátor. Nie je defaultné triedenie.
Má tiež zabudovanú forEach funkciu.

Kód: [Vybrat]
const R = require('ramda');

let nums = [3, 1, 4, 2, 8, 5, 6];

console.log(R.sort((x, y) => x-y, nums));
console.log(R.sort((x, y) => y-x, nums));

nums.forEach(e => console.log(e), nums);


120na80

Re:Problémy s JavaScript v praxi
« Odpověď #110 kdy: 27. 09. 2018, 22:50:06 »
Treba takove dinosauri cecko (resp jeho kompilery) za poslednich 20 let na kazdou jen trochu nebezpecnejsi nebo nejednoznacnejsi vec zacaly hazet warningy, ale jak koukam tak moderni trend je opacny, vynadat chudakovi nezkusenemu programatorovi do lam, lopat a at si precte dokumentaci.

BTW: Kdyz procitam povysenecke reakce Vlada na prvnich dvou strankach, opravdu rad bych videl nejaky jeho produkt. Byla by nejaka ukazka?

Vlado je preci JS buh. Koupil si knizku a uz naprogramoval skoro funkcni tic-tac-toe!

Nejlepší programátor EU

Re:Problémy s JavaScript v praxi
« Odpověď #111 kdy: 27. 09. 2018, 23:47:04 »
Vlado je jen lopata co si čte dokumentaci před spaním a dělá machry.

Když už něco v JS dělat, tak bez TS ani ránu. Je to úplně nebe a dudy.

Až na to přijde i tady Vlado, tak se budeme mít všichni lépe a nebude třeba mu ukazovat na základní nedostatky jazyka JS,viz ty s*ačky se sortem a porovnáváním.

Kit

Re:Problémy s JavaScript v praxi
« Odpověď #112 kdy: 28. 09. 2018, 05:23:54 »
Populárna knižnica Ramda to má vyriešené tak, že je nutné zadať komparátor. Nie je defaultné triedenie.
Má tiež zabudovanú forEach funkciu.

A k čemu je to dobré, když to Javascript umí nativně?

Ffff

Re:Problémy s JavaScript v PRAXI
« Odpověď #113 kdy: 28. 09. 2018, 10:51:41 »
https://wtfjs.com/
:o Díky moc! Tohle by mělo ukončit všechny debaty...
Presne tak, napraseny jazyk za 10 dni. Jsem rad, ze se javascript zatim nepouziva treba v medicine, autech, chemii...

Jano7

Re:Problémy s JavaScript v praxi
« Odpověď #114 kdy: 28. 09. 2018, 10:56:15 »
Populárna knižnica Ramda to má vyriešené tak, že je nutné zadať komparátor. Nie je defaultné triedenie.
Má tiež zabudovanú forEach funkciu.

A k čemu je to dobré, když to Javascript umí nativně?

Ramda toho samozrejme dokáže oveľa viac. Keď už Ramdu používame v projekte, tak prečo v rámci konzistentnosti nepoužiť aj sort, forEach funkcie?

Kód: [Vybrat]
const R = require('ramda');

// senior is a person over 70

const users = [
  { name: 'John', age: 25 }, { name: 'Lenny', age: 51 },
  { name: 'Andrew', age: 43 }, { name: 'Peter', age: 81 },
  { name: 'Anna', age: 43 }, { name: 'Albert', age: 76 },
  { name: 'Adam', age: 47 }, { name: 'Robert', age: 72 }
];

console.log(R.pluck('age', users));
console.log(R.pluck('name', users));

let senAges = R.filter(e => e >= 70, R.pluck('age', users));
console.log(senAges);

console.log(`There are ${senAges.length} senior users`);


asd

Re:Problémy s JavaScript v praxi
« Odpověď #115 kdy: 28. 09. 2018, 12:20:12 »
Citace
Treba takove dinosauri cecko (resp jeho kompilery) za poslednich 20 let na kazdou jen trochu nebezpecnejsi nebo nejednoznacnejsi vec zacaly hazet warningy, ale jak koukam tak moderni trend je opacny, vynadat chudakovi nezkusenemu programatorovi do lam, lopat a at si precte dokumentaci.

Nahoďte nějaký linter, ideálně ESLint. Inteligentnější editor/IDE vás bude na warningy a chyby upozorňovat přímo v kódu, u těch tupějších vystačíte s konzolí. Dál si nainstalujte do prohlížeče podporu pro debugging(pokud to vaše IDE podporuje, třeba JetBrains IDE Support) a můžete si kódy v IDE rovnou krokovat. Jinak na hraní je super StackBlitz, tam můžete zkoušet třeba nejasnosti při čtení dokumentace...

oss

Re:Problémy s JavaScript v praxi
« Odpověď #116 kdy: 28. 09. 2018, 14:13:04 »
Ked chcete realny problem:
Teraz rieism istu vec, potreboval sok kniznicu na pracu z X, na NPM nebol problem, lebo som ich nasiel asi 20-30. Zial jedna nevedela to, druha to, tretia, dalsia bola zabugovana, dalsia nezvldala UTF-8 enkoding atd... tazke som si po dvoch dnoch hladania ju musel poradit inak.

A najlepsie na tom bolo, ze ani jedna  s tych kniznic nemala dokumentaciu okrem jedneho trapneho prikladu, takze na to aby som zistil, ci je pre mna vhodna som kazdu kniznicu musel vyskusat alebo sa pozerat na jej zdrojove kody.

Takze, ked mame jazyk, kde 90% kniznic je nedokoncenych polodorobkov, kde 90% komunity prasi kod, kde nedokazu zachovat konzistenciu jazyka ani stylu, kde na rutinne veci treba pouzivat kniznicu alebo trasnkompiler, asi s tym jazykom nebude nieco v poriadku.

Kit

Re:Problémy s JavaScript v praxi
« Odpověď #117 kdy: 28. 09. 2018, 14:26:08 »
Ramda toho samozrejme dokáže oveľa viac. Keď už Ramdu používame v projekte, tak prečo v rámci konzistentnosti nepoužiť aj sort, forEach funkcie?

Kód: [Vybrat]
const R = require('ramda');

// senior is a person over 70

const users = [
  { name: 'John', age: 25 }, { name: 'Lenny', age: 51 },
  { name: 'Andrew', age: 43 }, { name: 'Peter', age: 81 },
  { name: 'Anna', age: 43 }, { name: 'Albert', age: 76 },
  { name: 'Adam', age: 47 }, { name: 'Robert', age: 72 }
];

console.log(R.pluck('age', users));
console.log(R.pluck('name', users));

let senAges = R.filter(e => e >= 70, R.pluck('age', users));
console.log(senAges);

console.log(`There are ${senAges.length} senior users`);

Kód: [Vybrat]
console.log(users.map((user) => (user.age)))
console.log(users.map((user) => (user.name)))
console.log(users.filter((user) => (user.age >= 70)))

Co ještě umí Ramda? Pokud možno zkus najít něco, co Javascript nativně neumí.

Jano7

Re:Problémy s JavaScript v praxi
« Odpověď #118 kdy: 28. 09. 2018, 16:01:15 »
Citace
Co ještě umí Ramda? Pokud možno zkus najít něco, co Javascript nativně neumí.

Ramda je veľmi prepracovaná, tam je toho veľa. Natívne sa dá spraviť všetko, akurát to nemusí byť také elegantné a krátke.

Funkcia compose, pipe:

Kód: [Vybrat]
let val = R.compose(Math.abs, R.add(1), R.multiply(2))(-4)
console.log(val);

var f = R.pipe(Math.pow, R.negate, R.inc);
console.log(f(3, 4));

Funkcia range:

Kód: [Vybrat]
const R = require('ramda');

console.log(R.range(1, 10));

console.log(R.sum(R.range(2, 8)));

Partition:

Kód: [Vybrat]
const R = require('ramda');

let nums = [4, -5, 3, 2, -1, 7, -6, 8, 9];

let [ neg, pos ] = R.partition(e => e < 0, nums);

console.log(neg);
console.log(pos);

Pokročilé spracovanie dát pomocou where:

Kód: [Vybrat]
const R = require('ramda');
const moment = require('moment');

const users = [
  { name: 'John', city: 'London', born: '2001-04-01' },
  { name: 'Lenny', city: 'New York', born: '1997-12-11' },
  { name: 'Andrew', city: 'Boston', born: '1987-02-22' },
  { name: 'Peter', city: 'Prague', born: '1936-03-24' },
  { name: 'Anna', city: 'Bratislava', born: '1973-18-11' },
  { name: 'Albert', city: 'Bratislava', born: '1940-12-19' },
  { name: 'Adam', city: 'Trnava', born: '1983-12-01' },
  { name: 'Robert', city: 'Bratislava', born: '1935-05-15' },
  { name: 'Robert', city: 'Prague', born: '1998-03-14' }
];


let res1 = R.filter(R.where({ city: R.equals('Bratislava') }))(users);
console.log(res1);

let res2 = R.filter(R.where({
  city: R.equals('Bratislava'),
  name: R.startsWith('A')
}))(users);

console.log(res2);

let res3 = R.filter(R.where({
  born: (dt) => getAge(dt) > 40}))(users);

console.log(res3);

function getAge(dt) {

    return moment.duration(moment() - moment(dt, 'YYYY-MM-DD', true)).years();
}

Kit

Re:Problémy s JavaScript v praxi
« Odpověď #119 kdy: 28. 09. 2018, 17:34:27 »
Ramda je veľmi prepracovaná, tam je toho veľa. Natívne sa dá spraviť všetko, akurát to nemusí byť také elegantné a krátke.

Kdybys uvedl i očekávaný výstup, jistě bych ti místo toho napsal nativní zápis v Javascriptu, který bude kratší a přehlednější. Zkusím odhadnout, co Ramda dělá:
Kód: [Vybrat]
// console.log(R.compose(Math.abs, R.add(1), R.multiply(2))(-4));
console.log(Math.abs(-4*2+1))

// var f = R.pipe(Math.pow, R.negate, R.inc);
// console.log(f(3, 4));
var f = (a, b) => -(a^b)+1
console.log(f(3, 4));

// console.log(R.range(1, 10));
console.log(Array.from({length: 10}, (x,i) => i+1));

// console.log(R.sum(R.range(2, 8)));
console.log(Array.from({length: 7}, (x,i) => i+2).reduce((a, b) => a+b));

let nums = [4, -5, 3, 2, -1, 7, -6, 8, 9];
// let [ neg, pos ] = R.partition(e => e < 0, nums);
let neg = nums.filter(e => e<0);
let neg = nums.filter(e => e>=0);

To poslední se mi dělat nechce, ale bude to něco podobného.

No dobrá, poslední tři mám o něco delší, ale stejně jsi mě nepřesvědčil o užitečnosti Ramdy.