ercnam
6k
2018-05-21 17:49:58 작성 2018-05-21 17:54:26 수정됨
5
1034

자바스크립트) 원본 배열이 오염(?) 되었습니다..?


고객정보 리스트를 출력하는 페이지가 보안규정 때문에 일부 텍스트를 마스킹(*) 처리 해야되게 생겼습니다.


다만 조건이 개별 ROW를 클릭시 마스킹 하지 않은 원본 데이터가 alert 창 등으로 출력될것..


원본 배열을 따로 할당한 임의의 배열에 옮겨담고(originData).

마스킹할 배열(maskedData)도 만들어서 담은 다음에 마스킹 배열에 마스킹 작업 실시후

jqgrid에 hidden 컬럼으로 해당 고객정보의 no를 심어놓고 이 번호로 매칭해서 뿌려줄 계획이었습니다.

(단순 ROW번호로 할려니 페이징 때문에 안될거 같더군요)

아무튼 이제 원본 배열을 담은 originData의 데이터를 no 에 맞게 보여주면 땡인데...


띠용.. originData의 내용도 마스킹이 되버리네요;;?


.done(function(r_custInfo){        	
console.log("검색된 고객정보", r_custInfo);
maskedData = r_custInfo;
originData = r_custInfo;
if(r_custInfo.length > 0){
	for(let i = 0 ; i < maskedData.length ; i++){
		// 개인정보 마스킹..
		maskedData[i].Addr = 마스킹함수(maskedData[i].Addr);
	}

(origin, masked 배열 2개 모두 전역변수 선언했습니다)

대충 배열 데이터를 ajax로 받아서 각각의 새 배열에 넣고, 마스킹용 배열만 for문 돌면서 정해진 마스킹 함수에 따라 데이터를 마스킹해서 다시 넣고.. 

그렇게 만들어진 maskedData를 jqgrid 에 로딩.


제가 보기엔 originData 가 마스킹될 이유가 없는데, origin도 그렇고 심지어

처음 ajax 로 받아온 r_custInfo 배열조차도 마스킹이 적용되 버리네요.

(콘솔 찍는 부분에 데이터들이 마스킹되어 출력됨)

마스킹 함수는 배열 내용을 인자로 받아서 자르고 붙이고 처리한 다음에 return 해줍니다.


대체 왜 이런 일이 일어나는 것일까요?

예전에 자바스크립트 배우면서 들어봤던 호이스팅인가 하는것 때문일까요?

그렇다면 해결책은...? 난감하군요

0
  • 답변 5

  • 꿀두
    1k
    2018-05-21 17:55:08 작성 2018-05-21 17:56:11 수정됨

    r_custInfo 변수를 안에서 다루시겠죠?? console 창을 객체참조때문에 보여지는것만 똑같이 보여져요.

    실제로 해당 값들 서버에서 찍어보면 제대로 나올거에요

    저도 가끔 그럴때 있는데 그럴땐 return false 로 분기나눠가면서 찍어봐요. 

    그래도 이상하게 나온다면 로직문제...

  • pokemon
    396
    2018-05-21 17:55:23

    rownum * pagenum = 단순 row번호 


  • 모닥불
    60
    2018-05-21 17:57:40

    maskedData, originData 두 개 모두 같은 배열의 주소를 갖고있습니다.

    원하는 값을 얻기위해서는 깊은 복사를 해야합니다.

    javascript 참조, 깊은 복사, 얕은 복사 부분 검색해서 찾아보시면

    원하시는 값을 얻을 수 있을 것 같네요!


  • ercnam
    6k
    2018-05-21 17:58:53

    꿀두

    문제는.. 실제 원본 데이터를 출력하는 곳은 jqgrid 의 onSelectRow 인데요.

    여기서는 originData에 접근해서 배열 안의 데이터를 출력하는데 이것도 마스킹 찍혀서 나옵니다...ㅋㅋ

    우짜 이런일이....

  • ercnam
    6k
    2018-05-21 18:12:07

    모닥불

    말씀하신게 맞았습니다.

    으어..C언어 시절에나 들었던걸 자바스크립트에서 다시 보게 될줄은 몰랐네요.

    감사합니다!

  • 로그인을 하시면 답변을 등록할 수 있습니다.