반응형

cannot read property 'substring' of null

cannot read property 'substring' of undefined

 

왜 null이라고 나오는지 모르겠네..

substring 하려는 변수를 ""를 붙여서 string 타입으로 바꿔버리자..

 

let aaa = ""+mydata;

 

반응형
반응형

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"}
반응형
반응형

반복문에 ajax를 넣었는데 ajax가 한 번만 실행되는 것 같다..?

ajax는 비동기라서

for문은 ajax의 호출완료따위 기다려주지 않는다...

async:false를 추가해야함

for (var i = 0; i < AdminArray.length; i++) {
        $.ajax({
          url: "https://testapi/ok",
          type: "PUT",
          data: paramList,
          async: false,
          success: function (response) {
            if (response.result === 1) {
              result *= 1;
            } else {
              result *= 0;
            }
          },
        });
      }
반응형
반응형

1. 차트 생성 및 데이터 바인딩

var chart = am4core.create("chartdiv", am4charts.PieChart);

//3D chart로 만들 경우
// am4core.useTheme(am4themes_animated);
//let pieChart = am4core.create("pieChartDiv", am4charts.PieChart3D);

// 데이터를 직접 명시할경우
chart.data = [{
  "country": "Lithuania",
  "litres": 501.9
}, {
  "country": "Czechia",
  "litres": 301.9
}, {
  "country": "Ireland",
  "litres": 201.1
}, {
  "country": "Germany",
  "litres": 165.8
}, {
  "country": "Australia",
  "litres": 139.9
}, {
  "country": "Austria",
  "litres": 128.3
}, {
  "country": "UK",
  "litres": 99
}, {
  "country": "Belgium",
  "litres": 60
}, {
  "country": "The Netherlands",
  "litres": 50
}];

//data object를 넣을경우
//pieChart.data = chartData;

2. 차트 범례 설정

//범례 생성
chart.legend = new am4charts.Legend();
//범례 높이사이즈
chart.legend.maxHeight = 50;
//범례 스크롤 여부
chart.legend.scrollable = true;
//범례 이름 설정
chart.legend.labels.template.text="국가 : {country}";


3. 차트 시리즈 설정

//차트 시리즈 생성
var pieSeries = chart.series.push(new am4charts.PieSeries());
//바인딩할 데이터 이름
pieSeries.dataFields.value = "litres";
//데이터 분류(category) 이름
pieSeries.dataFields.category = "country";
//파이 부분별 구분선 색
pieSeries.slices.template.stroke = am4core.color("#fff");
//파이에 마우스오버 시 표시할 툴팁 설정
pieSeries.slices.template.tooltipText="툴팁";
//파이 부분별 라벨 이름
pieSeries.labels.template.text = "{country}국가";


//저 수염처렁 주렁주렁 달린 라벨선을 삭제할 때 
pieSeries.ticks.template.disabled = true;


//라벨 자체를 싹 다 없애고 싶을 때
pieSeries.labels.template.disabled = true;


//가운데를 뚫고 싶다면
chart.innerRadius = am4core.percent(40);

반응형
반응형

y축 그리드 커스텀 설정, 옵션 (valueAxis)

이 부분 설정

1. valueAxis 생성

//valueAxis 생성
var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());

2. 최대/최소 (min, max)

// 최대,최소 설정. 미설정시 주어진 데이터 범위 내에서 알아서 보기좋게 생성함
valueAxis.min = 0;
valueAxis.max = 100;


3. 최대/최소 (strictMinMax)

//min, max를 미설정한경우 데이터의 최소/최대값을 y축 그리드의 최소/최대값으로 지정함
//썩 보기 좋지 않다. 미설정시 기본값은 false인듯.
valueAxis.strictMinMax = true;

 


4. 뒤집기(inversed)

//오름차순, 내림차순 설정. 미설정시 false.
//true 설정 시 y축 그리드 위아래가 뒤집힘
valueAxis.renderer.inversed = true;

 


5. inside

//y축 라벨이 표 안으로 들어옴
valueAxis.renderer.inside=true;


6. 라벨 숨김(minLabelPosition)

//최소값 라벨 숨김 설정
//0.01 = y축 전체 길이의 1%에 해당하는 부분
valueAxis.renderer.minLabelPosition = 0.01;


7. 투명도(strokeOpacity)

//y축 획의 투명도
//미설정시 기본 0인듯하며 1 설정시 불투명함
valueAxis.renderer.line.strokeOpacity = 1;

 


8. 두께 (strokeWidth)

// y축 획의 두께
valueAxis.renderer.line.strokeWidth = 2;


9. 표시 위치(opposite)

//y축 획 표시 위치.
//미설정시 기본 왼쪽, true 설정시 오른쪽
valueAxis.renderer.opposite = true;


10. 글자 색(label fill)

//y축 라벨 글자 색 
valueAxis.renderer.labels.template.fill = "#ffa200";

 


11. 선 색 (line stroke)

//y축 획의 색
valueAxis.renderer.line.stroke = "#ffa200";


12. y축 그리드 간격 (minGridDistance)

//y축 그리드의 최소간격
valueAxis.renderer.minGridDistance = 30;

 

미설정 - 값 10 - 값 20


13. 범례 표시 (title)

valueAxis.title.text="percentage";


시리즈에 적용하기

 series.yAxis = valueAxis;

 

여러개의 시리즈를 생성할 때

여러개의 y축을 사용하고 싶은경우 

시리즈 생성할때마다 valueAxis를 생성해주면 된다

반응형
반응형

javascript 에서 DataTable 생성시 발생하는 에러

개빡쳐

원인은 다음과 같다.

1. 필요한 라이브러리가 로드되지 않은 경우

2. jquery 라이브러리가 중복돼서 로드된 경우

3. 라이브러리 로드 순서

실제로 jquery 라이브러리가 중복돼서 저런 에러가 났었다.


1. 필요한 라이브러리가 로드되었는지 확인

<!--로컬에 넣어놓은거임-->
<script src="js/lib/jquery/jquery.dataTables.js"></script>
<script src="js/lib/datatables/dataTables.bootstrap4.js"></script>
<script src="js/lib/datatables/dataTables.buttons.min.js"></script>
<script src="js/lib/datatables/buttons.html5.min.js"></script>
<script src="js/lib/datatables/dataTables.responsive.js"></script>

DataTable을 사용하는 페이지 우클릭 > Network > All 에서 DataTable로 검색해보면

라이브러리가 로드되었는지 확인할 수 있다.


2. jquery 라이브러리가 중복되어 로드되었는지 확인 

  <!-- jquery 라이브러리가 두 개 있어서 아래꺼 주석처리하니 정상동작함 ㅠ-->
  <script src="js/lib/jquery/jquery-latest.min.js"></script>
  <!-- <script src="js/lib/jquery/jquery-1.12.4.js"></script> -->

html파일 상단 소스도 확인하고

js 파일로 따로 빼놓은 소스도 확인하고

html 코드 중간에 <script>로 박아넣은 소스도 확인하자 ^.ㅠ

개고생함


3. 라이브러리 로드 순서

로드 순서도 영향있다고 하는데 아직 안 겪어봐서 모르겠다 

 

반응형
반응형

두 방법 중 택 1

data가 string 으로 표현된경우

* JSON 파일 내용(myJson.json)

이 방법은 사용해보니 데이터를 한 줄로 적어놔야 했음..

data='[{"data1":"a","data2":"b"},{"data1":"a1","data2":"b2"}]'

 

1. JSON 파일 소스연결 

<script src="../json/myJson.json" type="text/javascript"></script>

 

2. 소스내에서 파싱해서 걍 쓰면 댐~!~! 

let mydata = JSON.parse(data);

반응형

data가 object로 표현된 경우

* JSON 파일 내용(myJson.json)

data=
	[{
    	"data1":"a",
    	"data2":"b"},
        {
        "data1":"a1",
        "data2":"b2"}
     ]

 

1. JSON 파일 소스연결 

<script src="../json/myJson.json" type="text/javascript"></script>

 

2. 파싱할때 stringify 사용

let mydata = JSON.parse(JSON.stringify(data));
console.log(mydata);
반응형
반응형
var toDate = new Date($("#toDate").val());
var fromDate = new Date($("#fromDate").val());
var dateGap = Math.ceil(
      (toDate.getTime() - fromDate.getTime()) / (1000 * 3600 * 24)
    );

ex)

fromDate : 2021-04-30

toDate : 2021-05-01

dateGap : 1 

 

반응형
반응형

없는 데이터(undefined인 데이터에) 배열로 접근하려고 해서 발생.

데이터는 JSON 데이터로 다음과 같다

data='[{"date":"20210514","avg":{"data1":"a","data2":"b","data2":"c"},
	"min":{"data1":"a","data2":"b","data2":"c"},
	"max":{"data1":"a","data2":"b","data2":"c"}}]'

 

배열로 만들어놓고 반복문으로 접근해서 처리하려 했는데.. 

TypeError: Cannot read property '0' of undefined 에러가 나면서 안 됨 

var arr = ["avg","min","max"];
var arr2 = ["data1","data2","data3","data4"];

for(var i=0; i<data.length; i++){
	for(var x=0; x<arr.length; x++){
    	for(var y=0; y<arr.length; y++){
        	if(data[i].arr[x].arr2[y]==null){
            	data[i].arr[x].arr2[y]="-";
            }
        }
    }
}

임의로 배열을 만들어서 index로 접근하면 안되나보다

구래서 다 뺐더니 됨 

for(var i=0; i<data.length; i++){
	if(data[i].avg.data1==null){
		data[i].avg.data1="-";
	}
}
반응형
반응형
//클릭 이벤트 연결
$(".Check").click(function () {
 	//방금 클릭한 dom의 id값 가져오기
	let checkedId = $(this).attr("id");
	//방금 클릭한 dom의 name값 가져오기
	let checkedName = $(this).attr("name");
	//방금 클릭한 dom의 class값 가져오기
	let checkedClass = $(this).attr("class"); 
    
	//id로 요소 선택하여 check여부 컨트롤
	document.getElementById(checkedId).checked=true;
	//class 이름으로 요소(들) 선택하여 check여부 컨트롤
	document.getElementsByClassName(checkedClass).checked=false;
	//Name으로 요소(들) 선택하여 check여부 컨트롤
	document.getElementsByName(checkedName).checked=false;
});

 

체크한 checkbox object 찾기 

 //class 명으로 dom 선택(checkbox들임)
 let obj = document.getElementsByClassName("optionCheck");
 
 //loop돌며 checked여부 검사
 for (var i = 0; i < obj.length; i++) {
      if (obj[i].checked == true) {
      //체크되었으면 체크 해제 
        obj[i].checked=false;
      }
  }
반응형

+ Recent posts