본문 바로가기
  • 포르쉐타고싶다
인포테인먼트 - development/알고리즘

[알고리즘] DATABASE에서 여러 테이블을 JOIN해서 가져온 데이터배열 중복 제거, 정리(2)

by 지오ㄴl 2020. 4. 2.

 

두가지 프로퍼티를 재정리하기위해 데이터를 가져오면

훨씬 더 많은 중복되는 객체들이 나온다.

왜냐하면 프로퍼티의 개수만큼 객체가 곱해서 나오기 때문이다.

(디비에서 가져오는 배열 크기 = 묶고싶은 객체 한덩어리 x 프로퍼티1 개수 x 프로퍼티2 개수)

 

하지만 전 포스팅에서 소개했던 방식을

그대로 추가된 프로퍼티에 대해 한 번씩만 더 써주면 된다.

 

먼저 상황을 가정해보자

 

- 우리가 원하는 배열 : A

[
     {
    	board_idx : 1,
        comment : "안녕하세요",
        tag : [
        	1,
            	2
        ],
        img_url : [
        	"http://aaaa.aaaaa.aaaaaa",
            	"http://bbbb.bbbbb.bbbbbb",
            ]
     },
     {
    	board_idx : 2,
        comment : "안녕히계세요",
        tag : [
        	3,
            	4
        ],
        img_url : [
            	"http://cccc.ccccc.cccccc",
        	"http://dddd.ddddd.dddddd"
            ]
     }
]
    	

 

- database에서 가져오게 되는 배열 : B

[
     {
    	board_idx : 1,
        comment : "안녕하세요",
       	tag : 1,
        img_url : "http://aaaa.aaaaa.aaaaaa"
     },
	{
    	board_idx : 1,
        comment : "안녕하세요",
       	tag : 2,
        img_url : "http://aaaa.aaaaa.aaaaaa"
     },
     {
    	board_idx : 1,
        comment : "안녕하세요",
        tag : 1,
        img_url : "http://bbbb.bbbbb.bbbbbb"
     },
     {
    	board_idx : 1,
        comment : "안녕하세요",
        tag : 2,
        img_url : "http://bbbb.bbbbb.bbbbbb"
     },
     {
    	board_idx : 2,
        comment : "안녕히계세요",
        tag : 1,
        img_url : "http://cccc.ccccc.cccccc"
     },
     {
    	board_idx : 2,
        comment : "안녕히계세요",
        tag : 2,
        img_url : "http://cccc.ccccc.cccccc"
     },
     {
    	board_idx : 2,
        comment : "안녕히계세요",
        tag : 1,
        img_url : "http://dddd.ddddd.dddddd"
     },
     {
    	board_idx : 2,
        comment : "안녕히계세요",
        tag : 2,
        img_url : "http://dddd.ddddd.dddddd"
     }
]


    	

 

 

재배열 함수 : (중복을 제거하는 함수 removeSameTag, removeSameImgUri는 맨 아래를 참고하면 되겠다.)

 

rearrangeBoardByTagAndImg: (boardArr) => {
        
        var targetAllResult = [];
        var preTagArr = [];
        var preImgArr = [];
        var preTargetIdx = 0;
        for (var idx in boardArr) {
            //이전거랑 reviewIdx가 다르면 이전 img_uri 배열 확정 저장 및 예비 이미지 배열(preImgArr)초기화
            //첫번째와 마지막이 아닌경우
            if (idx != 0 && idx != boardArr.length - 1) {
                if (preTargetIdx != boardArr[idx].board_idx) { //이전 reviewIdx와 다를때
                    // console.log(1);
                    //중복제거

                    boardArr[idx - 1].tag_idx = tools.removeSameTag(preTagArr);
                    boardArr[idx - 1].board_img_uri = tools.removeSameImgUri(preImgArr);
                    targetAllResult.push(boardArr[idx - 1]);

                    preTagArr = [];
                    preImgArr = [];
                    preTagArr.push(boardArr[idx].tag_idx);
                    preImgArr.push(boardArr[idx].board_img_uri);
                } else {
                    // console.log(2);
                    //이전거랑 reviewidx가 같으면 preImgArr(img_uri배열)에 자신의 img_uri 추가
                    preTagArr.push(boardArr[idx].tag_idx);
                    preImgArr.push(boardArr[idx].board_img_uri);
                }
            }
            if (idx == 0) {
                console.log(3);
                preTagArr.push(boardArr[idx].tag_idx);
                preImgArr.push(boardArr[idx].board_img_uri);
            }
            //마지막
            if (idx == boardArr.length - 1) {
                if (preTargetIdx != boardArr[idx].board_idx) {
                    // console.log(4);
                    //reviewIdx가 이전거랑 다를때
                    //전 review를 resultArr에 푸쉬
                    console.log(idx);
                    //인자 카페 개수가 1개 이상일 때 적용, 1개면 이 if문 적용 x
                    if(idx != 0) {
                        boardArr[idx - 1].tag_idx = tools.removeSameTag(preTagArr);
                        boardArr[idx - 1].board_img_uri = tools.removeSameImgUri(preImgArr);
                        console.log("hi");
                        console.log( boardArr[idx - 1].tag_idx);
                        targetAllResult.push(boardArr[idx - 1]);
    
                        //preImgArr초기화
                        preTagArr = [];
                        preImgArr = [];
                        preTagArr.push(boardArr[idx].tag_idx);
                        preImgArr.push(boardArr[idx].board_img_uri);
                    }
                    
                    boardArr[idx].tag_idx = preTagArr;
                    boardArr[idx].board_img_uri = preImgArr;
                    //이 review 바로 result에 푸쉬
                    targetAllResult.push(boardArr[idx]);
                } else {
                    // console.log();
                    //reviewIdx가 이전거랑 같을때
                    preTagArr.push(boardArr[idx].tag_idx);
                    preImgArr.push(boardArr[idx].board_img_uri);
                    boardArr[idx].tag_idx = tools.removeSameTag(preTagArr);
                    boardArr[idx].board_img_uri = tools.removeSameImgUri(preImgArr);
                    console.log("hi");
                    console.log( boardArr[idx - 1].tag_idx);
                    targetAllResult.push(boardArr[idx]);

                }

            }
            preTargetIdx = boardArr[idx].board_idx;
        }
        return targetAllResult;

    }

 

위의 함수를 보면 저느이 포스팅에서 보여줬던 방식 그대로 이용하여

추가된 프로퍼티에 대해서도 똑같이 적용해

각 for문제 한 줄씩 추가되어있는 것을 볼 수 있다.

 

이것이 가능한 이유는

해당 프로퍼티도 개수만큼 따로 나오긴 하지만

순서만큼은 묶여서 나오기 때문이다.

 

이 함수에 대해 더 구체적인 이해가 필요하시다면 댓글을 달아주시면 되겠습니다.

 

 

- 위에서 중복을 제거하는데 사용된 함수 :

	
    removeSameTag: (arr) => {
        if(arr.length>0){
            const result = [];
            var s = 0;
            var i = 0; //반복횟수
            for (var e of arr) {
                result.forEach(it => {
                    if (it == e) {
                        s = 1;
                    }
                })
                if (s != 1) {
                    result.push(e);
                }
                s = 0;
                i++;
            }
            return result;
        }
    },
    
    removeSameImgUri: (arr) => {
        if(arr.length>0){
            const result = [];
            var s = 0;
            var i = 0; //반복횟수
            for (var e of arr) {
                result.forEach(it => {
                    if (it == e) {
                        s = 1;
                    }
                })
                if (s != 1) {
                    result.push(e);
                }
                s = 0;
                i++;
            }
            return result;
        }
        
    }
반응형

댓글