반응형
AJAX에서 return 받은 결과값을
여러 함수에서 이용하려다가
자꾸 값이 똑같아져서...
AJAX 동기화 문제인가.. 함수 순서때문인가.. 어리둥절하다가 알아냄...^.ㅠ
내 문제는 이거였다..
array2 값을 c와 d에 따로 담아서
c의 값을 바꿨는데 d값도 덩달아 바뀐거...
let array2=[{"key":"메뉴","value":"짜장"},{"key":"사이드","value":"탕수육"}];
let c = array2;
let d = array2;
c[0].value="짬뽕";
console.log(d[0].value); //짬뽕 출력
심지어 아래와 같은 방식으로 복사를 했는데도 자꾸 값이 바뀌는 것이었다...
for(let i in array2){
c[i] = array[i];
d[i] = array[i];
}
같은 예라고 할 수 있겠다. 이것이 바로 참조값(주소값)이 복사가 되는 얕은 복사.
let array=["1","2","3"];
let a = array;
let b = array;
a[0]="text";
console.log(b[0]); //"text" 출력
a <- array 주소값
b <- array 주소값
이렇게 담기면서
a[0]을 변경 -> array[0] 변경 -> b[0] 변경
이렇게 되었던것..
깊은복사 방법
1. 반복문으로 때려넣기
반복문으로 값을 하나하나 때려넣어주면 참조값이 아닌 값이 들어가기 때문에
더이상 영향을 받지 않는다.
let array3 = ["a","b","c"];
let e=[];
let f=[];
for(let i in array3){
e[i] = array3[i];
f[i] = array3[i];
}
e[0]="eee";
console.log(f[0]); //"a" 출력
JSON 구조의 배열일 경우 {키:값}을 하나하나 때려넣어 줘야한다
let array4=[{"key":"동물","value":"갱쥐"},{"key":"동물","value":"보노보노"}];
let x = [];
let y = [];
for(let i in array4){
x.push({"key":array4[i].key,"value":array4[i].value});
y.push({"key":array4[i].key,"value":array4[i].value});
}
x[0].value="포로리";
console.log(y[0].value); //"갱쥐" 출력
2. slice
slice 를 이용해도 깊은 복사가 된다.
slice 는 start 부터 end 까지 대상 배열에서 꺼내와 새로운 배열을 만들어 값을 집어 넣는다.
start 와 end 가 주어지지 않으면 전체 배열을 복사한다.
let array5 = ["aa","bb","cc"];
let v = array5.slice();
let w = array5.slice();
v[0]="ddd";
console.log(w[0]);
3. Object.assign
Object.assing()은 뒤의 인자를 앞에 인자에 합쳐 넣는다.
var o1 = {name:'kim'};
var o2 = Object.assign({},o1);
o2.name='kim2';
console.log(o1,o2); //{name: "kim"} {name: "kim2"}
반응형
'코딩 관련 > Javascript와 jQuery, JSON' 카테고리의 다른 글
[Datatable] datatable 예시, datatable 옵션, datatable 생성 (0) | 2021.05.27 |
---|---|
cannot read property 'substring' of undefined (0) | 2021.05.26 |
[JavaScript]for문에서 Ajax 사용 / ajax 반복사용 (0) | 2021.05.18 |
[JavaScript] 로컬 JSON파일 가져오기, JSON 파일 읽기/ javascript json 읽기 / html json (2) | 2021.05.14 |
[JavaScript] 날짜 간 차이 구하기, 날짜 간 일수 구하기 (0) | 2021.05.14 |