문제 )
filter, includes, from을 사용해서 문자열 'e'가 포함된 노드로 구성된 배열을 만들어서 반환하기
function print(){
/*
filter, includes, from을 사용해서 문자열 'e'가 포함된
노드로 구성된 배열을 만들어서 반환하기
*/
let listItem = document.getElementsByTagName("li");
let newArray = Array.from(listItem);
let newData = [];
newArray.filter(function (n){
if((n.textContent).includes("e") === true){
newData.push(n.textContent);
}
})
for(list of newData){
document.write(list + "</br>");
}
}
print();
문제 풀기전....
node란, html DOM의 head, body 등등의 태그들만이라고 생각했었는데
노드는 요소노드(태그들), 텍스트노드, 속성노드(href 같은), 문서노드(document 자체), 주석노드(html의 주석) 들로 구분되어있더라
첫번째 관문은 node의 개념을 잘 모르니 노드리스트로 구성되게 노드를 솎아내는 작업 자체가 불가하여
TCP SCHOOL의 노드 부분을 쭈욱 1회독 했다 (http://tcpschool.com/javascript/js_dom_nodeList)
Array 메소드 filter
filter 메소드는 이름 그대로 요소들을 필터링하는 역할을 한다.
array(배열).filter(function(n){}) 의 형태로 사용되어지고, 콜백 함수의 리턴은 boolean 타입이다.
리턴이 true인 요소만 모아서 새로운 배열을 만든다. 생략하면? 리턴은 undefined이므로 false가 되고
만족하는 요소가 없다면? 빈 배열이 반환된다.
undefined도 아닌 빈 배열을 반환하는 것은 매우 큰 의미를 가집니다.
보통 도메인을 해결하기 위해서 Array 메소드를 여러개 연결하여 사용하는데 빈 배열이라도 반환 함으로써 중간에 오류가 나지 않고 다음 Array 메소드를 사용할 수 있습니다.
만약 filter로부터 빈 배열이 아닌 결과 없음을 의미하는 다른 값이 반환되었다면 에러를 뿜었을 것입니다.
출처: https://bblog.tistory.com/300 [편두리 기업블로그]
>> 이 내용을 보고 처음엔
newData = newArray.filter(function (n){
return (n.textContent).includes("e");
});
이런식으로 반환했더니, 마지막 for문으로 출력하는 부분에서 object로 나오더라
출제자의 의도가 이게 맞는지 모르겠지만, 내가 원한건 텍스트 노드만 나오길 원했던터라,
newArray.filter(function (n){
if((n.textContent).includes("e") === true){
newData.push(n.textContent);
}
})
return이 아닌 if 문으로 true / false를 판단하고 배열 객체에 push해주었다.
.includes()
.includes()는 문자열이 특정 문자열을 포함하는지 확인하는 메소드이다.
string.includes( searchString, length ) / 리턴은 boolean 타입이다.
searchString : 검색할 문자열로 필수 요소, 대소문자를 구분한다.
length : 검색을 시작할 위치로 선택 요소, 값이 없으면 전체 문자열을 대상으로 한다.
Array 메소드 .from()
유사 배열 객체나 반복 가능한 객체를 얕게 복사해 새로운 Array객체를 만든다.
let newArray = Array.from(arguments);
* 가짜배열(arguments) : 배열과 형태는 비슷하나 Array에 해당하지 않는 것
[ 강의 속 문제풀이 ]
function print(){
/*
filter, includes, from을 사용해서 문자열 'e'가 포함된
노드로 구성된 배열을 만들어서 반환하기
*/
let list = document.querySelectorAll("li");
console.log(toString.call(list));
// toString.call >> 자바스크립트에서 타입체크할때 많이 사용
//"[object NodeList]" node로 구성된 배열
let listArray = Array.from(list);
console.log(toString.call(listArray));
//"[object Array]" li노드로 구성된 배열
let eArray = listArray.filter(function(value){
return value.innerText.includes("e");
});
return eArray;
//console.log(eArray.length);
}
print();
여태 객체의 type 을 체크할때 typeof 정도만 알고 있었는데
toString.call() 을 사용하니 더 자세한 type을 확인할수 있었다.
filter 메소드는 콜백함수의 리턴 값에 따라 배열을 반환하는데 노드로 구성된 배열이다보니 출력은 따로 안한거 같다.
나는 요소를 조회할때 getElementsByTagName을 사용했지만,
강사님은 elem.querySelectorAll(css)을 사용했다.
querySelector가 더 넓은 범위의 파라미터를 선택할수 있는 점에서 getElements~ 보다 더 좋은 것 같다.
'Programming > JavaScript' 카테고리의 다른 글
[React / Node.js] react-router 리액트 라우터 알아보기 (0) | 2021.07.04 |
---|---|
[인프런] 레츠기릿 자바스크립트 / 끝말잇기, 셀프체크 쿵쿵따 만들기 (0) | 2021.06.30 |
[React / Node.js] 영화사이트 클론코딩 - 에러 해결, React, ES6 문법 알아보기 (0) | 2021.06.23 |
[인프런] 모던 자바스크립트(javascript) 개발을 위한 ES6 강좌 / 미니프로젝트 (0) | 2021.06.22 |
[인프런] 모던 자바스크립트(javascript) 개발을 위한 ES6 강좌 / 실습예제 2 - Destructuring 과 Set 을 활용한 로또 번호 생성기 (0) | 2021.06.21 |