|
| 1 | +const todo = { |
| 2 | + task: [], |
| 3 | + |
| 4 | + add: function (objToAdd) { |
| 5 | + const notAddedLength = this.task.length |
| 6 | + const newTodo = { |
| 7 | + id: this.getRanNum(), |
| 8 | + name: objToAdd.name, |
| 9 | + status: 'todo', |
| 10 | + tag: objToAdd.tag, |
| 11 | + timeData: 0, |
| 12 | + } |
| 13 | + this.task.push(newTodo) |
| 14 | + let statusNum = this.getStatusNum(this.task) |
| 15 | + this.printChangeThing(newTodo, notAddedLength) |
| 16 | + this.printStatusNum(statusNum) |
| 17 | + },//해야할일과 id값을 추가해주는 함수 |
| 18 | + |
| 19 | + getRanNum: function () { |
| 20 | + const ranNum = Math.floor(Math.random() * 100) |
| 21 | + const idArrays = this.task.map(obj => obj.id) |
| 22 | + if (idArrays.includes(ranNum)) { |
| 23 | + return this.getRanNum() |
| 24 | + } |
| 25 | + return ranNum; |
| 26 | + },//중복되지 않는 랜덤한 숫자를뽑아내는 함수 |
| 27 | + |
| 28 | + getStatusNum: function (accumulatedTask) { |
| 29 | + const statusNum = { |
| 30 | + todo: 0, |
| 31 | + doing: 0, |
| 32 | + done: 0 |
| 33 | + } |
| 34 | + accumulatedTask.forEach(obj => { |
| 35 | + statusNum[obj.status]++ |
| 36 | + }) |
| 37 | + return statusNum |
| 38 | + },//상태를 초기화 시켜주는 함수 |
| 39 | + |
| 40 | + printStatusNum: function (statusNum) { |
| 41 | + console.log(`현재상태 todo : ${statusNum.todo}, doing: ${statusNum.doing}, done : ${statusNum.done}`) |
| 42 | + },//상태를 출력해주는 함수 |
| 43 | + |
| 44 | + printChangeThing: function (objToPrint, beforeTaskLength, beforeTaskStatus) { |
| 45 | + if (this.task.length > beforeTaskLength) { |
| 46 | + console.log(`ID : ${objToPrint.id}, ${objToPrint.name} 항목이 추가되었습니다.`); |
| 47 | + } else if (this.task.length < beforeTaskLength) { |
| 48 | + console.log(`ID : ${objToPrint.id}, ${objToPrint.name} 삭제 완료`) |
| 49 | + } else { |
| 50 | + console.log(`ID: ${objToPrint.id}, ${objToPrint.name} 항목이 ${beforeTaskStatus} => ${objToPrint.status} 상태로 업데이트 되었습니다.`) |
| 51 | + } |
| 52 | + },//할일이 추가되거나 제거되거나 업데이트 될 때 적합한 내용을 출력해 주는 함수 |
| 53 | + |
| 54 | + update: function (objToUpdate) { |
| 55 | + let beforeTaskStatus = [] |
| 56 | + if (objToUpdate.nextstatus === 'doing') { |
| 57 | + this.updateDoingTime(objToUpdate) |
| 58 | + } else if (objToUpdate.nextstatus === 'done') { |
| 59 | + this.updateTakeTime(objToUpdate) |
| 60 | + } |
| 61 | + this.task = this.task.map(taskObj => { |
| 62 | + if (objToUpdate.id === taskObj.id) { |
| 63 | + beforeTaskStatus.push(taskObj.status) |
| 64 | + taskObj.status = objToUpdate.nextstatus.toLowerCase(); |
| 65 | + return taskObj |
| 66 | + } |
| 67 | + return taskObj |
| 68 | + }) |
| 69 | + const changedTask = this.task.filter(taskObj => { |
| 70 | + if (objToUpdate.id === taskObj.id) { |
| 71 | + return taskObj |
| 72 | + } |
| 73 | + }) |
| 74 | + let statusNum = this.getStatusNum(this.task) |
| 75 | + this.printChangeThing(changedTask[0], this.task.length, beforeTaskStatus[0]) |
| 76 | + this.printStatusNum(statusNum) |
| 77 | + },//상태 업데이트 함수//주어진 정보의 시간을 넣을 수 있도록 수정 요망 |
| 78 | + |
| 79 | + updateDoingTime: function (objToUpdate) { |
| 80 | + this.task.forEach(taskObj => { |
| 81 | + if (taskObj.id === objToUpdate.id) { |
| 82 | + taskObj.timeData = Date.now(); |
| 83 | + } |
| 84 | + }) |
| 85 | + },//업데이트할 객체를 인자로 받아 task내의 timeData값을 변경. |
| 86 | + |
| 87 | + updateTakeTime: function (objToUpdate) { |
| 88 | + this.task.forEach(taskObj => { |
| 89 | + if (taskObj.id === objToUpdate.id) { |
| 90 | + taskObj.timeData = this.getTakeTime(taskObj.timeData, Date.now()) |
| 91 | + } |
| 92 | + }) |
| 93 | + },//업데이트할 객체를 인자로 받아 task내의 timeData의 값을 걸린 시간으로 변경. |
| 94 | + |
| 95 | + getTakeTime: function (doingTime, currentTime) { |
| 96 | + let takenTime = '' |
| 97 | + let takenMsecTime = currentTime - doingTime |
| 98 | + const msecPerMinute = 1000 * 60, msecPerHour = msecPerMinute * 60, msecPerDay = msecPerHour * 24 |
| 99 | + const takenDays = Math.floor(takenMsecTime / msecPerDay) |
| 100 | + takenMsecTime = takenMsecTime - takenDays * msecPerDay |
| 101 | + const takenHours = Math.floor(takenMsecTime / msecPerHour) |
| 102 | + takenMsecTime = takenMsecTime - takenHours * msecPerHour |
| 103 | + const takenMinutes = Math.floor(takenMsecTime / msecPerMinute) |
| 104 | + takenMsecTime = takenMsecTime - takenMinutes * msecPerMinute |
| 105 | + takenTime += takenDays + '일, ' + takenHours + '시간, ' + takenMinutes + '분' |
| 106 | + return takenTime; |
| 107 | + },//걸린 시간을 계산해주는 함수 |
| 108 | + |
| 109 | + remove: function (objToRemove) { |
| 110 | + const notRemovedLength = todo.task.length |
| 111 | + let filteredTask = this.task.filter(taskObj => taskObj.id === objToRemove.id) |
| 112 | + let removedTask = this.task.filter(taskObj => taskObj.id !== objToRemove.id) |
| 113 | + this.task = removedTask |
| 114 | + this.printChangeThing(filteredTask[0], notRemovedLength) |
| 115 | + },//할 일과 id값을 제거해주는 함수 |
| 116 | + |
| 117 | + show: function (status) { |
| 118 | + console.log(`[${status} 상태인 할 일들]`) |
| 119 | + this.task.forEach(taskObj => { |
| 120 | + if (status === 'done' && taskObj.status === 'done') { |
| 121 | + console.log(`ID : ${taskObj.id}, ${taskObj.name}, [${taskObj.tag}], ${taskObj.timeData}`) |
| 122 | + } else if (taskObj.status === status) { |
| 123 | + console.log(`ID : ${taskObj.id}, ${taskObj.name}, [${taskObj.tag}]`) |
| 124 | + } |
| 125 | + }) |
| 126 | + },//인자로 입력받은 상태의 정보들을 출력해주는 함수 |
| 127 | + |
| 128 | + showTag: function (tag) { |
| 129 | + const todoNum = this.getSameTagAndStatusNum(tag, 'todo') |
| 130 | + console.log(`[todo, 총 ${todoNum}개]`) |
| 131 | + this.printByTag(tag, 'todo'); |
| 132 | + const doingNum = this.getSameTagAndStatusNum(tag, 'doing') |
| 133 | + console.log(`[doing, 총 ${doingNum}개]`) |
| 134 | + this.printByTag(tag, 'doing'); |
| 135 | + const doneNum = this.getSameTagAndStatusNum(tag, 'done') |
| 136 | + console.log(`[done, 총 ${doneNum}개]`) |
| 137 | + this.printByTag(tag, 'done'); |
| 138 | + },//수정필요, 여기에 showTags기능까지 넣어볼 것.//함수는 한가지의 일만 하는게 맞는듯 |
| 139 | + |
| 140 | + printByTag: function (tag, status) { |
| 141 | + this.task.forEach(taskObj => { |
| 142 | + if (taskObj.tag === tag && taskObj.status === status) { |
| 143 | + if (status === 'done') { |
| 144 | + console.log(`ID : ${taskObj.id}, ${taskObj.name}, ${taskObj.timeData}`) |
| 145 | + return; |
| 146 | + } |
| 147 | + console.log(`ID : ${taskObj.id}, ${taskObj.name}`) |
| 148 | + } |
| 149 | + }) |
| 150 | + },//tag의 값과 상태의 값을 인자로 받아 출력해주는 함수 |
| 151 | + |
| 152 | + getSameTagAndStatusNum: function (tag, status) { |
| 153 | + let sameTagAndStatusNum = 0 |
| 154 | + this.task.forEach(taskObj => { |
| 155 | + if (taskObj.tag === tag && taskObj.status === status) { |
| 156 | + sameTagAndStatusNum++ |
| 157 | + } |
| 158 | + }) |
| 159 | + return sameTagAndStatusNum |
| 160 | + },//태그와 상태가 같은 것들의 개수를 세어주는 함수 |
| 161 | + |
| 162 | + showTags: function () { |
| 163 | + const taggedTask = this.task.filter(obj => { |
| 164 | + return obj.tag !== undefined |
| 165 | + }) |
| 166 | + const sameTagArrays = this.getTagArrays(taggedTask); |
| 167 | + sameTagArrays.forEach(tag => { |
| 168 | + const sameTagNum = this.getSameTagNum(tag, taggedTask) |
| 169 | + this.printSameTag(tag, taggedTask) |
| 170 | + }) |
| 171 | + },//태그에 따라 모든 값을 출력해주는 함수 |
| 172 | + |
| 173 | + getTagArrays: function(taggedTask) { |
| 174 | + const sameTagArrays = []; |
| 175 | + taggedTask.forEach(taggedTaskObj => { |
| 176 | + if(!sameTagArrays.includes(taggedTaskObj.tag)) { |
| 177 | + sameTagArrays.push(taggedTaskObj.tag) |
| 178 | + } |
| 179 | + }) |
| 180 | + return sameTagArrays |
| 181 | + },//현재 task배열 내에있는 모든 tag값들을 중복 없이 따로 모아놓는 배열을 만드는 함수 |
| 182 | + |
| 183 | + printSameTag: function(tag, taggedTask) { |
| 184 | + console.log(`${tag}, 총 ${sameTagNum}개`) |
| 185 | + taggedTask.forEach(taggedTaskObj => { |
| 186 | + if(tag === taggedTaskObj.tag) { |
| 187 | + console.log(`ID : ${taggedTaskObj.id}, ${taggedTaskObj.name}, [${taggedTaskObj.status}]`) |
| 188 | + } |
| 189 | + }) |
| 190 | + },//tag의 값에 따라서 출력해주는 함수 |
| 191 | + |
| 192 | + getSameTagNum: function(tag, taggedTask) { |
| 193 | + sameTagNum = 0 |
| 194 | + taggedTask.forEach(taggedTaskObj => { |
| 195 | + if(tag === taggedTaskObj.tag) { |
| 196 | + sameTagNum++ |
| 197 | + } |
| 198 | + }) |
| 199 | + return sameTagNum |
| 200 | + },//같은 태그의 개수를 세어주는 함수 |
| 201 | + |
| 202 | + showAll: function () { |
| 203 | + const statusNum = this.getStatusNum(this.task) |
| 204 | + console.log(`총 ${this.task.length}개의 리스트를 가져왔습니다. |
| 205 | + 지금부터 2초뒤에 todo내역을 출력합니다........`) |
| 206 | + setTimeout(function () { |
| 207 | + console.log(`[todo, 총${statusNum.todo}개]`); |
| 208 | + this.show('todo') |
| 209 | + console.log(`지금부터 3초뒤에 doing내역을 출력합니다.......`) |
| 210 | + setTimeout(function () { |
| 211 | + debugger; |
| 212 | + console.log(`[doing, 총${statusNum.doing}개]`) |
| 213 | + this.show('doing') |
| 214 | + console.log(`지금부터 2초뒤에 done내역을 출력합니다........`) |
| 215 | + setTimeout(function () { |
| 216 | + console.log(`[done, 총${statusNum.done}개]`) |
| 217 | + this.show('done') |
| 218 | + }.bind(todo), 2000) |
| 219 | + }.bind(todo), 3000) |
| 220 | + }.bind(todo), 2000) |
| 221 | + },//입력된 정보들의 상태에 따라 시간차로 출력해주는 함수 |
| 222 | +}//해야 할일 객체 |
| 223 | +// 테스트 |
| 224 | + |
| 225 | +todo.add({ name: '자바스크립트', tag: 'programming'}); |
| 226 | +todo.add({ name: 'C++', tag: 'programming' }); |
| 227 | +todo.add({ name: '회식', tag: '회사' }); |
| 228 | +todo.add({ name: '노래연습', tag: '자기개발' }); |
| 229 | +todo.add({ name: '과장님업무', tag: '회사' }) |
| 230 | + |
| 231 | +// todo.update({ id: 3, nextstatus: 'doing' }) |
| 232 | +// todo.update({ id: 3, nextstatus: 'done' }) |
| 233 | +// todo.update({ id: 2, nextstatus: 'done' }) |
| 234 | +todo.showTag('programming') |
| 235 | +todo.showTags(); |
| 236 | +todo.show('todo') |
| 237 | +todo.showAll(); |
| 238 | + |
| 239 | + |
0 commit comments