type Book = {
title: string;
copyright?: string;
author?: string;
}
const books: string[] = [
"신",
"뇌",
"개미",
"파피용",
"제 3인류"
]
books.forEach((book: string, idx: number) => {
console.log(book, idx);
})
forEach는 식을 이용한 순회이다. 함수가 값으로써 전달되기 때문이다.
배열의 위치 값을 계속 접근하기 위해 i같은 변수를 선언하는 for문과 달리 forEach는 변수가 필요가 없다.
단점은 for문보다 성능이 떨어진다. 큰 데이터일 경우 성능이 저하된다.
const bookObjects: Book[] = books.map((book: string) => {
return {
title: book,
author: undefined
}
})
console.log(bookObjects)
forEach와 유사하지만 map 함수한테 전달된 함수가 반환 값을 하나씩 쌓아서 하나의 배열로 만든 다음에 반환을 해 준다. (forEach는 아무런 값을 반환하지 않는다)
map함수는 원본 배열에서 데이터를 입력받아 함수가 리턴한 데이터로 새로운 배열을 만들어서 반환하는 함수이다.
books는 문자열이 들어가 있는 배열이다. map 함수를 통해서 문자열이 인자로 전달되었고, title과 author가 들어있는 객체를 리턴하였다.
const BernardOneBook: Book[] = books
.map((book: string) => ({
title: book
}))
.map((book: Book) => ({
...book,
author: 'Bernard Werber'
}));
console.log(BernardOneBook);
map 함수는 배열을 리턴한다. 고로 map을 두번, 세번씩 쓸 수 있다.
첫번째 map으로 인해 title 값이 들어간 객체를 담은 배열을 반환한다.
두번째 map은 앞에서 만든 객체를 ...book을 통해 풀어 놓고 author라는 속성을 추가해서 반환한다.
const bookTitleToBookObject = (book: string) => ({ title: book });
const makeAuthor = (name: string) => (book: Book) => ({
...book,
author: name,
})
const bernardTwoBooks: Book[] = books
.map(bookTitleToBookObject)
.map(makeAuthor("Bernard Werber"));
console.log(bernardTwoBooks)
bookTitleToBookObject는 책 제목을 객체로 만드는 함수이다.
makeAuthor는 이름을 받고 book 객체를 받고 author를 추가한다. arrow가 두 번 등장한다.
첫번째 함수의 반환값은 함수이고 그 반환된 함수의 반환 값은 객체이다. (커링 기법)
makeAuthor에 "Bernard Werber" 인자를 넘겨주면
(name: string) => (book: Book) => ({
...book,
author: name,
})
이 함수가 호출되고 두번째 함수를 리턴한다. 그 값을 map함수한테 전달되는 메커니즘이다.
map이 호출될 때
(book: Book) => ({
...book,
author: name,
})
이 함수가 호출 된다
심화2로 인해 코드의 재사용성이 높아진다. 다른 책들의 다른 작가의 이름을 넣어야 할 경우 bookTitleToBookObject 와 makeAuthor를 이용하면 되기 때문이다.