본문 바로가기

Language/JavaScript(ES6)

Javascript로 Hash 처리하기

c++이나 자바 파이썬의 map, Hashmap, dictionary과 같이 Hash처리하기 위해 마땅히 좋은 방법이 없는거 같다.

아니면 내가 모르는 거겠지...

 

오랜만에 한 번 사용해봤는데 너무 미숙해서 정리를 하고자 한다.

 

1
var a = [1,2,3,1,2,2,2,3,1,4,6]; // 실험 배열

해당 배열을 중복 처리, 객체 정렬등을 해보도록 한다.

 

중복값의 누적

다른 언어를 사용하다가 자바스크립트를 사용할 때 가장 헷갈리는 부분이다.

자바스크립트는 객체의 키를 배열처럼 접근 할 수 있다.

1
2
3
4
5
6
7
obj = {}
obj[1= 1;
obj // { 1: 1}
obj[1= ++obj[1];
obj // { 1: 2}
obj[2= 1;
obj // { 1: 2, 2 : 1}

< 접근 예제 >

 

이를 이용하면 다음과 같이 중복의 누적이 가능하다.

1
2
3
4
var b = a.reduce((x,y) => {
    x[y] = ++x[y] || 1;
    return x;
},{}); // { 1:3, 2:4, 3:2, 4:1, 6:1}

< 중복의 누적 >

이때 핵심은 index 접근이 아닌 전달받는 값이 곧 index가 된다는 점

 

각각의 key value는 다음과 같이 접근 가능하다.

 

1
2
3
4
5
for(value in b){
    value // 1,2,3,4,6 => KEY값
    b // {1:3 2:4 ....}
    console.log(b[value]) // 3, 4, 2, 1, 1 => VALUE 값
}
 

< KEY와 VALUE의 접근 >

 

다만 이 방법은 정렬이 필요할 시에 적합하지 않다. 정렬 하기 위해서 JSON객체처럼 배열에 담아야 한다.

 

JSON 객체처럼 누적하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class pair{
    constructor(){
        this.key;
        this.value;
    }
}
var c = a.reduce((pre,post,idx) => {
    if(!pre[post]){
        pre[post] = new pair()
        pre[post].key = post
        pre[post].value = 1
    }else{
        pre[post].value++
    }
    return pre;
},[]).filter(value => value)
console.log(c);
// [ pair { key: 1, value: 3 }, 
//     pair { key: 2, value: 4 }, 
//     pair { key: 3, value: 2 }, 
//     pair { key: 4, value: 1 }, 
//     pair { key: 6, value: 1 } ] 

일단 그냥 객체가 아니라 클래스를 만들어 줘야 한다. 아니면 다른 인스턴스를 주입할수 없기 때문에 하나의 객체가 배열에 담기기 때문이다.

그 다음은 값이 없다면 새로운 인스턴스를 생성하고 아니라면 값을 늘려준다.

이 때 배열에 값을 추가할 떄, 인덱스 순이 아니라 특정 값을 통해 접근하기 때문에 배열에 빈 값이 생길 수 있다.

< filter가 없을 때 0번과 5번에 빈 값이 생긴다. >

그렇기 때문에 filter를 하여 없는 값은 제거해 준다.

이렇게 값을 얻었다면 json객체를 다루듯 정리하면 된다.

1
2
3
4
5
6
7
8
9
10
c.sort((pre,post)=> {
    return pre.value - post.value
})
 
console.log(c)
// [ pair { key: 4, value: 1 }, 
//     pair { key: 6, value: 1 }, 
//     pair { key: 3, value: 2 }, 
//     pair { key: 1, value: 3 }, 
//     pair { key: 2, value: 4 } ]

< value 순으로 정렬해보았다 >