nukw0n
찐이의 개발 연결구과
nukw0n
전체 방문자
오늘
어제
  • 분류 전체보기 (38)
    • 유연해지기 (21)
      • React.js (11)
      • Javascript (5)
      • webpack & babel (1)
      • etc. (4)
      • Next.js (0)
    • 단단해지기 (13)
      • Algorithm (9)
      • Computer Science (4)
    • 속닥속닥 (4)
    • 책읽는 남자 (0)

블로그 메뉴

    공지사항

    인기 글

    태그

    • Error Boundary
    • error 안 뜸
    • javascript
    • intersectionobserver api
    • vanilla spa
    • dfs
    • React
    • React 18
    • Auto Batching
    • bfs
    • vallia 라우터
    • fallback UI
    • 프로그래머스
    • useBuiltIns
    • 콜백 ref
    • Batching
    • 알고리즘
    • history API
    • 백준
    • sass vs postcss

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    nukw0n

    찐이의 개발 연결구과

    [Javascript] 자바스크립트 Map 정렬하기
    유연해지기/Javascript

    [Javascript] 자바스크립트 Map 정렬하기

    2021. 5. 3. 22:52

    잡소리, 서론

    코딩테스트 응시언어가 js로 제한되어있는 곳에 지원했다.
    자바스크립트와 친숙했던 나지만 자바스크립트로 알고리즘 문제들을 풀어본 적이 없어서 이것저것 찾아보면서 공부하고 있다.

    Map이라는 자료구조가 있는 줄 모르고 객체에 삽입/삭제하면서 삽질했던 나를 반성하며 포스트를 작성한다.

    Map

    Key-Value

    자바스크립트의 Map은 key-value 쌍으로 이루어져 있는 자료구조이다.
    key 값에 아무거나 다 넣을 수 있다. 심지어 함수도 넣을 수 있다.

    const testmap = new Map();
    testmap.set(1,123);
    testmap.set(2,345);
    testmap.set(3,789);
    
    const funcRef = () => {};
    testmap.set(funcRef, 'function can be key.');
    
    console.log(testmap.get(funcRef)); // 'function can be key'
    
    console.log(testmap.get(() => {}));  // undefined
    
    for (let [key, val] of testmap.entries()) {
      console.log(key, ':', val); // 1:123, 2:345, 3: 789
    }

    funcRef 와 () => {} 는 내용은 같지만 참조하는 레퍼런스가 다르기 때문에 함수를 키 값으로 지정해주었다면 위와 같은 방식으로 키를 참조해야한다.

    Iteration

    Map을 순회할 때에는 for ... of 혹은 forEach 구문을 사용하면 된다.

    for (let [key, val] of testmap.entries()) {
      console.log(key, ':', val); // 1:123, 2:345, 3: 789
    }
    
    for (let [key, val] of testmap) {
      console.log(key, ':', val);
    }
    
    testmap.forEach((val, key) => {
      console.log(key, ':', val);
    })

    forEach 구문을 사용할 때에는 key와 value의 순서가 반대라는 것만 기억하면 되겠다.

    Sort

    sort는 Array 객체의 프로로타입에 정의되어 있는 함수이다.

    이 sort를 Map에서 사용하기 위해 Map과 Array의 관계에 대해 살펴보자.

    Map의 생성자는 iterable한 즉, 반복가능한 요소들에 대해서만 인자로 허용된다.

    Map, Array, String 모두 iterable한 요소이다.

    const testArray = [[1, 123], [2, 345], [3, 789]];
    const arrayToMap = new Map(testArray);
    
    for (let [key, val] of arrayToMap) {
      console.log(key, ':', val);
    }

    즉, 다음과 같이 2차원 배열에 대해서 Map으로 변환이 가능하다. 물론 이 반대도 가능하다.

    const mapToArray = [...arrayToMap];
    const mapToArray_2 = Array.from(arrayToMap);
    
    for (const [key, val] of mapToArray) {
      console.log(key, ':', val);
    }
    
    for (const [key, val] of mapToArray_2) {
      console.log(key, ':', val);
    }

    mapToArray와 mapToArray_2 모두 같은 요소를 갖는다.

    이렇게 Map을 Array로 변환 시킨 뒤 sort를 하면 되겠다.

    mapToArray.sort((a, b) => b[1] - a[1]); // value값 기준 내림차순정렬
    
    mapToArray.sort((a, b) => b[0] - a[0]); // key값 기준 내림차순정렬
    
    mapToArray.sort((a, b) => a[1] - b[1]); // value값 기준 오름차순정렬
    
    mapToArray.sort((a, b) => a[0] - b[0]); // key값 기준 오름차순정렬

    필요에 의해 다시 Map으로 변환시켜도 된다.

    const sortedMap = new Map(mapToArray.sort((a, b) => b[1] - a[1]));

    '유연해지기 > Javascript' 카테고리의 다른 글

    JavaScript Set 내 맘대로 구현하기  (1) 2022.11.30
    Vanilla Javascript로 간단한 SPA 라우터 구현해보기  (4) 2022.05.13
    [Javascript] Iterable, 반복자 그리고 생성자 함수에 대하여  (0) 2021.09.27
    [Javascript] Promise 예제 풀어보기  (0) 2021.09.12
      '유연해지기/Javascript' 카테고리의 다른 글
      • JavaScript Set 내 맘대로 구현하기
      • Vanilla Javascript로 간단한 SPA 라우터 구현해보기
      • [Javascript] Iterable, 반복자 그리고 생성자 함수에 대하여
      • [Javascript] Promise 예제 풀어보기
      nukw0n
      nukw0n
      프론트엔드 개발자 권혁진입니다.

      티스토리툴바