우선 2주차 숙제를 2시까지 했다. 역시 아직은 어려운 부분들이 많은 것 같다.
replace
String타입은 replace()함수를 이용해 특정 문자열을 다른 문자열로 바꿀 수 있다.
- 기본적으로 replace()는 먼저 검색되는 1개의 문자열만 변환한다.
- 여러 문자열을 변환할 때는 정규 표현식을 이용하여 일치하는 모든 문자열을 변환할 수 있다.
예시)
let str = 'Hello world, Java';
str = str.replace('Java', 'JavaScript');
console.log(str);
이렇게만 설명하면 이해가 잘 안 가는데
let str = 'Hello world, Java, Java, Java';
str = str.replace('Java', 'JavaScript');
console.log(str); //Hello world, JavaScript, Java, Java
이 코드는 문자열에 바꾸려는 문자열이 여러 개 있어도, 가장 먼저 찾은(앞에 있는) 문자열 1개만 변환한다.
여러 문자열을 변환하려면 정규 표현식을 써야한다고 했는데, 정규표현식은 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식언어이다.
기능으로는 문자 검색, 추출, 치환이 있으며 /Pattern/flag처럼 패턴과 플래그로 구성된다.
let str = 'Hello world, Java, Java, Java';
str = str.replace(/Java/g, 'JavaScript');
console.log(str); //Hello world, JavaScript, JavaScript, JavaScript
여기서 패턴은 java, 플래그는 g가 되는데, g는 해당하는 모든 문자열을 변환하라는 의미이다.
여기서 패턴과 플래그란
1. 패턴 : 문자열의 일정한 규칙을 표현
- 패턴은 /로 열고 닫으며, 문자열의 따옴표는 생략한다.
- 따옴표를 포함하면 따옴표까지도 패턴에 포함되어 검색된다.
- 패턴은 특별한 의미를 가지는 메타문자 또는 기호로 표현 가능하다.
[참고]
https://hamait.tistory.com/342
2) 플래그(Flag) : 정규 표현식의 검색 방식을 설정
- 원하는 문자 검색 결과를 반환하도록 할 수 있다.
- 정규 표현식의 옵션으로서, 꼭 설정하지 않아도 된다.
- 하나 이상의 플래그를 동시에 설정할수도 있다.
- 순서는 상관없다.
g(global) 플래그
: 모든 문자를 검색
g가 없으면 원래는 처음 발견된 결과만 출력된다.
g가 있으면 있는 모든 검색 결과를 배열로 반환한다.
str = 'Hi wecode! I am code kim.';
const regexp1 = /code/; // we'code'
const regexp2 = /code/g; // we'code', 'code' kim
i(ignoreCase) 플래그
: 영어 대소문자를 구분하지 않음(무시함)
i가 없으면 원래는 code와 Code는 다르다. ==> 대소문자를 구분함!
ig를 같이 사용하게 되면 대소문자 구분없이 표현식의 모든 검색결과를 배열로 반환한다.
m(multi line) 플래그
: 문자열의 행이 바뀌더라도 패턴 검색을 계속함
y(sticky) 플래그
: lastIndex 속성을 이용해 원하는 위치에서 검색을 시작
const str = "Cats love cats, and we love cats."
const regExp = /cats/igy;
exp.lastIndex = 4; // index 4 이후부터 검색
lastIndex를 지정한 뒤 플래그 y로 검색하면, 그 위치에서 검색이 시작된다.
u(unicode) 플래그
: 유니 코드 문자를 처리
s(single line) 플래그
: 개행(\n)을 무시하여 단일 라인으로 취급
최근에는 많은 브라우저에서 사용되지 않는다.
대소문자 구분 없이 문자열을 치환하기 위해서는 플래그에 i를 추가하면 된다.
let str = 'Hello world, Java, Java, Java';
str = str.replace(/java/gi, 'JavaScript');
console.log(str); //Hello world, JavaScript, JavaScript, JavaScript
+) 공백으로 치환하고 싶으면 " "를 넣으면 된다.
개인 과제
3주치 강의를 보다 보니 뭔가 개인 과제를 조금이나마 진행할 수 있을 것 같아, 영화의 api를 받아왔다.
const options = {
method: 'GET',
headers: {
accept: 'application/json',
Authorization: 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJkMzcxNjA2ZDhjZjFhNzExMGM3NDA4NDgyMzRkYTI5OCIsIm5iZiI6MTcyMTg5NTIxOS42Mzc4OTQsInN1YiI6IjY2OWRhNDQxZjE3YTkxMjZkMjRjMzE2ZSIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.ee981DIwG9c7sMsfzEQ20JrbYWmpJyD8_TcWcO0NXYM'
}
};
fetch('https://api.themoviedb.org/3/movie/now_playing?language=en-US&page=1', options)
.then(response => response.json())
.then(response => console.log(response))
.catch(err => console.error(err));
map에 result배열에 있는 데이터들을 담으면 될 줄 알고 진행했으나,
const myMovieMap = new Map(options.results);
console.log("---------------d---------------------d-------------------------------------------");
console.log(myMovieMap); // 'value' 출력
myMovieMap.set(options.key,options.value)
for (const entry of myMovieMap.entries()) {
console.log("------------------------------------d-------------------------------------------");
console.log(`${entry[0]}: ${entry[1]}`);
console.log("--------------------------------------------------v-----------------------------");
}
수많은 흔적들,,,,
자세히 알아보니 options에 데이터가 저장되있던 것이 아니었다.
사실 map쪽에 문제가 있는 줄 알고 이것저것 검색했는데, 그것을 먼저 정리한 후feach에 대해 다뤄보겠다.
for in 반복문은 객체의 key를 하나씩 가져온다.
for of문은 interable한 속성을 지닌 String, Array, TypedArray, Map, Set에서 값을 하나씩 가져온다.
허나 객체는 interable 이 아니기 때문에 Object.kyes 혹은 Object.values를 통해 배열로 바꿔서 값을 가져와야한다.
entries를 이용하면 enumerable 속성의 key와 value 배열을 동시에 가져올 수도 있다.
map 개념정리 및 사용예제
+) nodemon 실행하기
https://velog.io/@savin/Express-nodemon-%ED%8C%A8%ED%82%A4%EC%A7%80-npm-start
[참고 링크]
https://codechacha.com/ko/javascript-replace-in-string/
https://ko.javascript.info/regexp-introduction
https://devinserengeti.tistory.com/25