js koans 오답/리뷰노트 (mutability)

GY·2021년 6월 19일
0

[JS] 개념 정리

목록 보기
11/32
post-thumbnail

filter

var _; //globals

/* This section uses a functional extension known as Underscore.js - http://documentcloud.github.com/underscore/
     "Underscore is a utility-belt library for JavaScript that provides a lot of the functional programming support
      that you would expect in Prototype.js (or Ruby), but without extending any of the built-in JavaScript objects.
      It's the tie to go along with jQuery's tux."
 */
describe("About Higher Order Functions", function () {
  it("should use filter to return array items that meet a criteria", function () {
    var numbers = [1, 2, 3];
    var odd = _(numbers).filter(function (x) {
      return x % 2 !== 0;
    });

    expect(odd).toEqual([1, 3]);
    expect(odd.length).toBe(2);
    expect(numbers.length).toBe(3);
  });
  //filter는 조건에 맞는값은 제외한다.

map

  it("should use 'map' to transform each element", function () {
    var numbers = [1, 2, 3];
    var numbersPlus1 = _(numbers).map(function (x) {
      return x + 1;
    });
    //map은 함수를 호출한 그 결과대로 새로운 배열로 교체한다.
    expect(numbersPlus1).toEqual([2, 3, 4]);
    expect(numbers).toEqual([1, 2, 3]);
  });

reduce


  it("should use 'reduce' to update the same result on each iteration", function () {
    var numbers = [1, 2, 3];
    var reduction = _(numbers).reduce(function (
      /* result from last call */ memo,
      /* current */ x
    ) {
      return memo + x;
    },
    /* initial */ 0);
    // reduce : 함수 호출하여 더하고, 새로운 하나의 결과값만 반환
    expect(reduction).toBe(6);
    expect(numbers).toEqual([1, 2, 3]);
  });

foreach

  it("should use 'forEach' for simple iteration", function () {
    var numbers = [1, 2, 3];
    var msg = "";
    var isEven = function (item) {
      msg += item % 2 === 0;
    };

    _(numbers).forEach(isEven);

    expect(msg).toEqual("falsetruefalse");
    expect(numbers).toEqual([1, 2, 3]);
  });
  /*forEach :배열의 모든 요소를 반복하며 콜백함수를 실행
//각 요소들이 iseven의 조건에 부합하는지
어떻게 동작하는지가 잘 이해가 안된다.
  */
  it("should use 'all' to test whether all items pass condition", function () {
    var onlyEven = [2, 4, 6];
    var mixedBag = [2, 4, 5, 6];

    var isEven = function (x) {
      return x % 2 === 0;
    };

    expect(_(onlyEven).all(isEven)).toBe(true);
    expect(_(mixedBag).all(isEven)).toBe(false);
  });
  //onlyeven의 모든 요소가 isEven의 조건에 부합하는지
  it("should use 'any' to test if any items passes condition", function () {
    var onlyEven = [2, 4, 6];
    var mixedBag = [2, 4, 5, 6];

    var isEven = function (x) {
      return x % 2 === 0;
    };

    expect(_(onlyEven).any(isEven)).toBe(true);
    expect(_(mixedBag).any(isEven)).toBe(true);
  });

range


  it("should use range to generate an array", function () {
    expect(_.range(3)).toEqual([0, 1, 2]);
    expect(_.range(1, 4)).toEqual([1, 2, 3]);
    expect(_.range(0, -4, -1)).toEqual([0, -1, -2, -3]);
  });
  /*range : 시작숫자와 끝숫자로 연속된 숫자배열을 만들 수 있다.
  3번째 인수는 간격이다. 0부터 -4까지 연속된 숫자배열을 만들되, 간격은 -1인 것이다.
  (1,4) 끝숫자는 포함하지 않는다.[1,2,3]
  */

flatten

  it("should use flatten to make nested arrays easy to work with", function () {
    expect(
      _([
        [1, 2],
        [3, 4],
      ]).flatten()
    ).toEqual([1, 2, 3, 4]);
  });
  //flatten 은 배열을 평평하게 만든다.[1,2,[3]]은 [1,2,3]이 된다.

map

  it("should use chain() ... .value() to use multiple higher order functions", function () {
    var result = _([[0, 1], 2])
      .chain()
      .flatten()
      .map(function (x) {
  //map: 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환
        return x + 1;
      })
      .reduce(function (sum, x) {
        return sum + x;
      })
      /*
      arr.reduce(callback[,initialValue])
      reduce는 배열의 각 요소에 대해 콜백을 실행하며, 1개의 출력 결과를 만든다.
      배열 원소들의 전체 합을 구하거나 최대값을 구할 수 있다.
      첫번째 인자:reucer함수
      두 번째 인자:초기값initialValue 라는 빈 object
      배열의 각 요소가 주어진 콜백함수를 거친다.(reducer)
      reducer의 네가지 인자
        accumulator(누산기) reducer의 반환 값을 누적한다.
        currengValue:현재 처리할 요소
        currentIndex(생략가능):처리할 현재 요소의 인덱스
        array(생략가능): reduce()를 호출한 배열
        
       */
      .value();

    expect(result).toEqual(6);
  });
});
profile
Why?에서 시작해 How를 찾는 과정을 좋아합니다. 그 고민과 성장의 과정을 꾸준히 기록하고자 합니다.

0개의 댓글