Skip to content
This repository has been archived by the owner on Aug 10, 2021. It is now read-only.

Latest commit

 

History

History
213 lines (177 loc) · 6.29 KB

README.md

File metadata and controls

213 lines (177 loc) · 6.29 KB

window.functions.js

window.functions.js는 최소한의 기능만을 지원하는 대신 가장 좋은 성능을 가진 함수형 자바스크립트 라이브러리입니다. Partial.js와 거의 동일한 컨셉을 가지고 있지만, 보조 함수의 인자가 하나만 들어오거나, 가장 간결하거나 등의 특징을 가지고 있어서 이만의 쓰임새가 있습니다. 더 많은 기능이 필요하면 Partial.js와 함께 사용하면 좋습니다.

Pipe

_pipe

_pipe는 함수들을 모아서 하나의 함수로 합성하는 함수입니다. 왼쪽에서 오른쪽으로 실행됩니다.

function sum(a, b) {
  return a + b;
}

function square(a) {
  return a * a;
}

var f1 = _pipe(sum, square, square);
var result = f1(1, 2)
console.log(result);
// 81

_go

_go는 파이프라인의 즉시 실행 버전입니다. 첫 번째 인자로 받은 값을 두 번째 인자로 받은 함수에게 넘겨주고 두 번째 인자로 받은 함수의 결과는 세 번째 함수에게 넘겨주는 것을 반복하다가 마지막 함수의 결과를 리턴해줍니다.

_go(10, // 첫 번째 함수에서 사용할 인자
  function(a) { return a * 10 }, // 연속 실행할 함수 1
  // 100
  function(a) { return a - 50 }, // 연속 실행할 함수 2
  // 50
  function(a) { return a + 10 }); // 연속 실행할 함수 3
  // 60
  
var users = [
  { id: 1, name: "ID", age: 32 },
  { id: 2, name: "HA", age: 25 },
  { id: 3, name: "BJ", age: 32 },
  { id: 4, name: "PJ", age: 28 },
  { id: 5, name: "JE", age: 27 },
  { id: 6, name: "JM", age: 32 },
  { id: 7, name: "JI", age: 31 }
];

_go(users,
  _filter(function(u) { return u.age < 30; }),
  _map(function(u) { return u.name }),
  console.log);
// ["HA", "PJ", "JE"]

_mr

window.functions.js의 파이프라인 함수들은 Multiple Results를 지원합니다. _mr 함수를 함께 사용하면 다음 함수에게 2개 이상의 인자들을 전달할 수 있습니다.

_go(10, // 첫 번째 함수에서 사용할 인자
  function(a) { return _mr(a * 10, 50) }, // 두 개의 값을 리턴
  function(a, b) { return a - b }, // 두 개의 인자 받기
  function(a) { return a + 10 });
  // 60

_go(_mr(2, 3),
  function(a, b) {
    return a + b; // 2 + 3
  },
  function(a) {
    return a * a;
  });
  // 25

_tap

_tap은 받아둔 함수들을 모두 실행한 후 처음 받은 인자를 동일하게 리턴하는 파이프라인 함수입니다.

_go(10,
  _tap(
    function(a) { return a * a },
    console.log), // 100
  console.log); // 10

List, Object

_each

_each(list, iteratee) 리스트를 끝까지 순회하며 함수를 실행합니다.

_each([1, 2, 3], alert);
// alert 함수가 각 번호에 맞춰 실행됩니다.
_each({one: 1, two: 2, three: 3}, alert)
// alert 함수가 각 번호 값에 맞춰 실행됩니다.

_map

_map(list, iteratee) 리스트를 순회하며 주어진 함수로 새로운 배열을 생성합니다.

_map([1,2,3], function(num) { return num * 3; });
// [3, 6, 9]
_map({one: 1, two: 2, three: 3}, function(num) { return num * 3; });
// [3, 6, 9]

_filter

_filter(list, predicate) 리스트의 내부 값을 관찰하여 predicate의 결과가 참인 값들을 배열로 반환합니다.

var evens = _filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
console.log(evens); // [2, 4, 6]

_reject

_reject(list, predicate) 리스트를 순회하며 predicate의 결과가 참인 값들을 제외한 배열을 반환합니다.

var odds = _reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
console.log(odds); // [1, 3, 5]

_reduce

_reduce(list, iteratee, [memo]) inject 혹은 foldl라고 불리는 이 함수는 리스트를 순회하며 하나의 값을 추출합니다. memo는 옵션값이며 추출될 값의 초기값이 됩니다.

_reduce([1, 2, 3], function(memo, num) { return memo + num; }, 0);
// 6

_reduce({one: 1, two: 2, three: 3}, function(memo, num) { return memo + num; }, 0);
// 6

_find

_find(list, predicate) 리스트의 내부 값을 관찰하여 predicate의 결과가 참인 값을 반환합니다.

var even = _find([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
console.log(even); // 2

_sum

_sum(array, iteratee) 배열의 내부 값에 iteratee를 적용한 값들을 더합니다.

_sum([1, 2, 3], function(v) {
  return v * 10;
});
// 60
_sum(['a', 'b', 'c'], function(v) {
  return v.toUpperCase();
});
// ABC

Etc

_keys

_keys(object) 객체가 가진 프로퍼티의 이름인 키 값들을 모아 배열을 만듭니다.

_keys({one: 1, two: 2, three: 3});
// ["one", "two", "three"]

_range

_range([start], stop, [step]) 범위를 정해 정수로 구성된 배열을 만듭니다. 값을 하나만 전달하면 0부터 전달된 값 이전까지가 범위가 됩니다.

_range(10);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_range(1, 11);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_range(0, 30, 5);
// [0, 5, 10, 15, 20, 25]
_range(0, -10, -1);
// [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_range(0);
// []

_identity

function _identity(v) { return v };

_noop

function _noop() {};

_clone

_clone(object) 얕은 복사로 객체를 복제합니다. 중첩 객체의 경우에는 복제하지 않고 참조합니다.

_clone({name: 'moe'});
// {name: 'moe'};

_has

_has(object, key) 객체에 특정 키가 존재하는지 확인합니다.

_has({a: 1, b: 2, c: 3}, "b");
// true

_extend

_extend(destination, *sources) __sources__에 해당하는 객체들의 프로퍼티를 얕게 복사해서 __destination__에 해당하는 객체에 붙여 객체를 확장합니다.

_extend({name: 'moe'}, {age: 50});
// {name: 'moe', age: 50}

_defaults

_defaults(object, *defaults) 객체의 프로퍼티 중 값이 undefined인 프로퍼티의 값을 __defaults__객체의 값으로 채웁니다.

var iceCream = {flavor: "chocolate"};
_defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
// {flavor: "chocolate", sprinkles: "lots"}