Array HOF 연습 문제
1. html 생성
아래 배열을 사용하여 html을 생성하는 함수를 작성하라.
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
| const todos = [ { id: 3, content: "HTML", completed: false, }, { id: 2, content: "CSS", completed: true, }, { id: 1, content: "Javascript", completed: false, }, ];
function render() { let html = "";
todos.forEach((todo) => { html += `<li id = "${todo.id}"> <label><input type ="checkbox" ${todo.completed ? "checked" : ""}>${ todo.content }</label> </li>\n`; });
return html; }
console.log(render());
function render() { return todos .map((todo) => { return `<li id = "${todo.id}"> <label><input type ="checkbox" ${todo.completed ? "checked" : ""}>${ todo.content }</label> </li>\n`; }) .join(""); }
console.log(render());
|
2. 특정 프로퍼티 값 추출
요소의 프로퍼티(id, content, completed)를 문자열 인수로 전달하면 todos의 각 요소 중, 해당 프로퍼티의 값만을 추출한 배열을 반환하는 함수를 작성하라.
단, for 문이나 Array#forEach는 사용하지 않도록 하자.
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
| const todos = [ { id: 3, content: "HTML", completed: false, }, { id: 2, content: "CSS", completed: true, }, { id: 1, content: "Javascript", completed: false, }, ];
function getValues(key) { return todos.map((todo) => todo[key]); }
console.log(getValues("id")); console.log(getValues("content")); console.log(getValues("completed"));
|
3. 프로퍼티 정렬
요소의 프로퍼티(id, content, completed)를 문자열 인수로 전달하면 todos의 요소를 정렬하는 함수를 작성하라.
단, todos는 변경되지 않도록 하자.
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
| const todos = [ { id: 3, content: "HTML", completed: false, }, { id: 2, content: "CSS", completed: true, }, { id: 1, content: "Javascript", completed: false, }, ];
const sortBy = (key) => { const _todos = [...todos]; return _todos.sort((todo1, todo2) => todo1[key] > todo2[key] ? 1 : todo1[key] < todo2[key] ? -1 : 0 ); };
console.log(sortBy("id"));
console.log(sortBy("content"));
console.log(sortBy("completed"));
|
4. 새로운 요소 추가
새로운 요소(예를 들어 { id: 4, content: 'Test', completed: false }
)를 인수로 전달하면 todos의 선두에 새로운 요소를 추가하는 함수를 작성하라. 단, Array#unshift나 Array#push는 사용하지 않도록 하자.
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
| let todos = [ { id: 3, content: "HTML", completed: false, }, { id: 2, content: "CSS", completed: true, }, { id: 1, content: "Javascript", completed: false, }, ];
function addTodo(newTodo) { todos = [newTodo].concat(todos); }
function addTodo(newTodo) { todos = [newTodo, ...todos]; }
addTodo({ id: 4, content: "Test", completed: false, });
console.log(todos);
|
5. 특정 요소 삭제
todos에서 삭제할 요소의 id를 인수로 전달하면 해당 요소를 삭제하는 함수를 작성하라.
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
| let todos = [ { id: 3, content: "HTML", completed: false, }, { id: 2, content: "CSS", completed: true, }, { id: 1, content: "Javascript", completed: false, }, ];
const removeTodo = (id) => { todos = todos.filter((todo) => todo.id !== id); };
removeTodo(2);
console.log(todos);
|
6. 특정 요소의 프로퍼티 값 반전
todos에서 대상 요소의 id를 인수로 전달하면 해당 요소의 completed 프로퍼티 값을 반전하는 함수를 작성하라.
hint) 기존 객체의 특정 프로퍼티를 변경/추가하여 새로운 객체를 생성하려면 Object.assign 또는 스프레드 문법을 사용한다.
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
| let todos = [ { id: 3, content: "HTML", completed: false }, { id: 2, content: "CSS", completed: true }, { id: 1, content: "Javascript", completed: false }, ];
function toggleCompletedById(id) { const index = todos.findIndex((todo) => todo.id === id);
return (todos[index] = todos[index].completed ? { ...todos[index], completed: false } : { ...todos[index], completed: true });
}
toggleCompletedById(2);
console.log(todos);
|
7. 모든 요소의 completed 프로퍼티 값을 true로 설정
todos의 모든 요소의 completed 프로퍼티 값을 true로 설정하는 함수를 작성하라.
hint) 기존 객체의 특정 프로퍼티를 변경/추가하여 새로운 객체를 생성하려면 Object.assign 또는 스프레드 문법을 사용한다.
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
| let todos = [ { id: 3, content: "HTML", completed: false }, { id: 2, content: "CSS", completed: true }, { id: 1, content: "Javascript", completed: false }, ];
function toggleCompletedAll() { todos = todos.map((v) => ({ ...v, completed: true }));
return todos; }
toggleCompletedAll();
console.log(todos);
|
8. completed 프로퍼티의 값이 true인 요소의 갯수 구하기
todos에서 완료(completed: true)한 할일의 갯수를 구하는 함수를 작성하라.
단, for 문, Array#forEach는 사용하지 않도록 하자.
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
| let todos = [ { id: 3, content: "HTML", completed: false, }, { id: 2, content: "CSS", completed: true, }, { id: 1, content: "Javascript", completed: false, }, ];
const countCompletedTodos = () => todos.filter((todo) => todo.completed).length;
const countUncompletedTodos = () => todos.filter((todo) => !todo.completed).length;
console.log(countCompletedTodos()); console.log(countUncompletedTodos());
|
9. id 프로퍼티의 값 중에서 최대값, 최소값 구하기
todos의 id 프로퍼티의 값 중에서 최대값을 구하는 함수를 작성하라.
단, for 문, Array#forEach는 사용하지 않도록 하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| let todos = [ { id: 3, content: "HTML", completed: false }, { id: 2, content: "CSS", completed: true }, { id: 1, content: "Javascript", completed: false }, ];
function getMaxId() { return Math.max(...todos.map((todo) => todo.id), -1); }
function getMinId() { return todos.length ? Math.min(...todos.map((todo) => todo.id)) : -1; }
console.log(getMaxId()); console.log(getMinId());
|
Nyong’s GitHub