반응형
DataStructures and Algorithms with javascript
책 "자바스크립트 자료구조와 알고리즘"을 보고 리스트 구현을 ES6로 해보는 연습이다.
책에서는 ES5 문법이므로 보고 ES6로 바꾸는 과정이 있다.
[전체 코드]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | //ES6 List 클래스 만들기 class List{ constructor(){ this.listSize = 0; this.pos = 0; this.dataStore = []; } //get 키워드 활용 -> 사용은 .length로 변수처럼 사용 get length(){ return this.listSize; } //뒤에 요소 삽입 append(element){ this.dataStore[this.listSize] = element; this.listSize++; } //요소 검색 후 인덱스 리턴 find(element){ for(let i=0;i<this.listSize;i++){ if(element === this.dataStore[i]){ return i; } } return -1; /* //for~in문을 사용하니까 결과값이 'String' 타입... for(val in this.dataStore){ if(element === this.dataStore[val]){ return val; } } */ } //요소 제거 remove(element){ let foundAt = this.find(element); if(foundAt > -1){ this.dataStore.splice(foundAt,1);//해당 배열 요소 삭제 --this.listSize;//크기 1개 축소 return true; } return false; } //리스트 요소 출력 toString(){ return this.dataStore; } //특정 위치 다음에 요소 삽입 insert(element,after){ let insertPos = this.find(after); if(insertPos > -1){ this.dataStore.splice(insertPos+1, 0, element); this.listSize++; return true; } return false; } //리스트 전체 삭제 clear(){ this.dataStore = []; //delete 즉시 배열을 삭제하고 빈 배열 재생성 this.listSize = this.pos = 0; } //리스트에 특정값이 있는지 판단 contains(element){ for(let i = 0; i<this.listSize;i++){ if(this.dataStore[i] === element){ return true; } } return false; } front(){ this.pos = 0; } end(){ this.pos = this.listSize-1; } prev(){ if(this.pos > 0){ this.pos--; } } next(){ if(this.post < this.listSize-1){ this.pos++; } } currPost(){ return this.pos; } moveTo(position){ this.pos = position; } getElement(){ return this.dataStore[this.pos]; } } | cs |
[test]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | const list = new List(); list.append(1); list.append(2); list.append(3); console.log(list.length);//3 console.log(list.find(3));//2 (index) list.remove(2); console.log(list.length);//2 console.log(list.toString());//[1, 3] list.clear(); console.log(list.length);//0 list.append(1); console.log(list.toString()); list.append(2); list.append(3); list.append(4); list.append(5); console.log(list.toString());//[1,2,3,4,5] list.front(); console.log(list.getElement());//1 list.next(); console.log(list.getElement());//2 list.next(); list.next(); list.prev(); console.log(list.getElement());//3 | cs |
하면서 의문이 생겼던 것은 for-in문을 이용하면 요소가 'String'타입으로 나왔던 것이다.
또한 naver d2에서 본 것 같은데 for-in, for-of 구문보다 일반적인 for(;;)구문이 약간 더 빠르다고 해서 일단은 일반적인 for(;;)문으로 작성했다... 검색은 해봤는데 아직 for-in구문에서 value가 String인지 모르겠다. (검색중)
for문 반복할 때 계속 재할당(?)되니까 let 키워드 사용.
== 보다 === 비교 사용 권장.
침고 도서 : DataStructures & Algorithms with javascript
반응형
'Javascript > Javascript(ES6)' 카테고리의 다른 글
ES6 자료구조 큐(Queue) 구현하기, 우선순위 큐 만들고, 큐 두개로 스택 만들기 (2) | 2018.01.17 |
---|---|
ES6 자료구조 스택(Stack)만들어보기, 스택 2개로 큐(Queue) 만드는 방법 (0) | 2018.01.14 |
ES6 자바스크립트 모듈 사용하기 (import, export) (0) | 2018.01.13 |
이터레이터(Iterator)와 for of 문(인덱스말고 값을 순회한다.) (0) | 2018.01.11 |
ES6 Class (클래스, Syntactic sugar, prototype을 이용하지만 문법적으로 예쁘게 만들어주는 class) (3) | 2018.01.09 |