Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Fungsional dengan JavaScript

Fungsional dengan JavaScript

https://www.meetup.com/lambdaindonesia/events/259616507/

Pening karena ingin mulai berpikir secara fungsional tapi bingung mau mulai dari mana? Jangan takut. Ternyata belajar pemrograman fungsional bisa diawali dengan berlatih lewat Javascript mengubah iterasi for/while menjadi penggunaan fungsi ordo-tinggi dari Array. Akan dikupas pemakaian Array secara tulen--berarti tanpa ada for/while--untuk mengimplementasikan algoritma dasar pencarian.

Ariya Hidayat

March 21, 2019
Tweet

More Decks by Ariya Hidayat

Other Decks in Programming

Transcript

  1. Array.prototype.map map calls callbackfn once for each element in the

    array, in ascending order, and constructs a new Array from the results. callbackfn is called with three arguments: • the value of the element • the index of the element, and • the object being traversed. [ ... ].map(callbackfn)
  2. Contoh Array.prototype.map [1, 2, 3].map(function (x) { return x *

    x; }); [1, 4, 9] [7, 7, 7].map(function (x, y) { return y; }); [0, 1, 2] y = index x = element
  3. Array.prototype.reduce [ ... ].reduce(callbackfn, initial) callbackfn is called with four

    arguments: • the previousValue (or value from the previous call to callbackfn), • the currentValue (value of the current element) • the currentIndex, and • the object being traversed.
  4. Contoh Array.prototype.reduce [1, 2, 3, 4, 5].reduce(function (sum, i) {

    return sum + i; }); [1, 2, 3, 4, 5].reduce(function (sum, i) { return sum + i; }, 100); 15 115 [1, 2, 3].reduce(function(result, x) { return result.concat(x + 2); }, []); [3, 4, 5]
  5. Angka (untuk Barisan) var result = []; for (var i

    = 1; i < 4; ++i) result.push(i) console.log(result); // [1, 2, 3]
  6. Karakter (untuk String) var list = ''; for (var i

    = 0; i < 26; ++i) list += String.fromCharCode(i + 65); console.log(list); // 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  7. Operator in Section 11.8.7 0 in Array(3); // false 1

    in Array(3); // false 2 in Array(3); // false 2 in [,,9]; // true toString relies on join (Section 15.4.4.5) join convertes undefined or null to an empty string
  8. Barisan Aritmatika Array.apply(0, Array(3)).map(function (x, y) { return y +

    1; }); [1, 2, 3] Array.apply(0, Array(3)).map(function (x, y) { return (y + 1) * (y + 1); }); [1, 4, 9] Array.apply(0, Array(3)) [undefined, undefined, undefined]
  9. Faktorial: Versi Loop function factorial(n) { var result = 1;

    for (var i = 1; i <= n; ++i) result *= i; return result; } factorial(5) 120 1 * 2 * 3 * 4 * 5
  10. Faktorial dari 5 x z 1 1 0 2 1

    6 2 24 3 120 4 x + x * z
  11. function primeList(N) { return Array.apply(0, Array(N)).map(function (x, y) { return

    y }). filter(function (i) { return (i > 1) && Array.apply(0, Array(1 + ~~Math.sqrt(i))). every(function (x, y) { return (y < 2) || (i % y !== 0) }); }); } primeList(20) [ 2, 3, 5, 7, 11, 13, 17, 19 ]
  12. function fibo(n) { return Array.apply(0, Array(n)).reduce(function(x, y, z){ return x.concat((z

    < 2) ? z : x[z-1] + x[z-2]); }, []); } [ 0, 1, 1, 2, 3, 5, 8, 13, 21 ] fibo(9)
  13. Cari String yang Terpanjang function findLongest(array) { for (var i

    = 0, longest = ''; i < array.length; ++i) if (array[i].length > longest.length) longest = array[i]; return longest; } findLongest(['ab', 'abc', 'a']) 'abc'
  14. dengan Array.prototype.reduce function findLongest(array) { return array.reduce(function (longest, entry) {

    return entry.length > longest.length ? entry : longest; }, '' }); } findLongest(['ab', 'abc', 'a']) 'abc'
  15. Ambil juga Indeksnya function findLongest(array) { return array.reduce(function (longest, entry,

    index) { return entry.length > longest.value.length ? { index: index, value: entry } : longest; }, { index: -1, value: '' }); } findLongest(['ab', 'abc', 'a']) { index: 1, value: 'abc' }
  16. Langkah demi Langkah 14 3 19 77 14 19 77

    3 19 77 3 14 77 3 14 19 3 14 19 77
  17. Cari yang Terkecil function findSmallest(array) { return array.reduce(function (min, entry,

    index) { return min.value < entry ? { index: index, value: entry } : min; }, { value: null }); } findSmallest([14, 3, 19, 77]) { index: 1, value: 3 }
  18. Ulangi N kali function sort(input) { var array = input.slice(0);

    return Array.apply(0, Array(array.length)).map(function () { return array.splice(findSmallest(array).index, 1).pop(); }); } Sebelum splice Sesudah splice [14, 3, 19, 77] [14, 19, 77] { index: 1, value: 3 }
  19. Implementasi Lengkap (8 Baris) function sort(input) { var array =

    input.slice(0); return Array.apply(0, Array(array.length)).map(function () { return array.splice(array.reduce(function (min, entry, index) { return min.value < entry ? min : index: index, value: entry }; }).index, 1).pop(); }); }