필터 메소드 관련 질문입니다.

21.04.23 22:23 작성 조회수 111

0

제로초님 안녕하세요!

좋은 강의 감사드립니다. 유튜브랑 블로그도 틈나는대로 보고있는데 많은 도움을 받고 있습니다.

가위바위보까지는 헷갈리는 부분만 이론 위주로 들었고 지뢰찾기부터 처음부터 따라가면서 코딩하고있는데요, 지뢰찾기 강의 중 필터 메소드 관련해서 궁금한 점이 생겨서 질문드립니다.

질문 01) 

var 주변 = []; 에 처음에는 concat 메소드를 사용하지 않고 8개 객체를 모두 넣었지만 맨윗줄이랑 맨아랫줄 클릭시 에러로 인해 if (tbody.children[줄 -/+ 1] )이라는 조건 후 concat사용해서 해결하신 부분이 있었는데요, 강의 후반부에서   Array.filter(function(v) { return !!v}); 라는 방법으로 배열에서 falsy 값들을 제외하는 방법이 있다는 것을 알게되었습니다.

그렇다면

주변.filter(function(v) {

return !!v;

}).filter(function(v) {

return [코드표.지뢰].includes(v);

}).length

와 같이 filter를 두번 잇는다면 concat을 사용하지 않고도 에러를 피해갈 수 있지 않을까 싶어서 질문드립니다. 

 질문 02)

두번째 질문도 첫번째 질문이랑 연관되어있는데요, 이건 실시간 댓글에서도 잠깐 질문이 나왔었는데, e.currentTarget에 해당하는 <td>클릭시 [줄] 부분은 가장 윗줄(-1)에서 에러가 발생했는데 왜 [칸] 부분은 가장 왼쪽(-1)에서 에러가 발생하지 않는지 궁금해서 질문드립니다.

영상에서는 처음에 "주변" 배열의 [칸], 즉 가로부터 테스트했을 때 에러가 났고 .length 붙이면서 해결이 되었는데요, 이건 length라는 메소드가 배열에 undefined가 있으면 건너뛰면서 숫자를 세기 때문에 가능했던걸까요? 

------------------------------------------------------------------------------------------------------

왠지 세로 부분에서 에러가 난건 length나 filter 등 메소드가 원인이 아니고 dataset[줄][칸]을 불러오는 과정에서 [줄] 부분에 참조값이 없어서(음수여서) [칸]을 찾을 수 없었기 때문에 에러가 발생한거같다는 생각이 드는데요, 그래도 궁금해서 질문드렸습니다..!(물론 저도 찾아볼 생각이고 강의 흐름상 크게 중요한 부분도 아닌 것 같아 답변 안해주셔도 상관없지만 혹시나 하는 마음에 질문드립니다.)

 마지막으로 , 한달정도 전에 노드교과서를 샀는데요(이때는 제로초님이 쓰신건줄 모르고 샀음) , 아직 도입부까지만 읽었습니다. 우선 리액트까지는 무조건 한다는 생각인데요, 그 다음에는 어떻게 해야할까요? 조언 부탁드립니다. (목표는 중견기업이고 백엔트/프론트엔드/UI 전부 다 할 생각입니다)

ps 자바스크립트책은 아직 안나온건가요?   

답변 1

답변을 작성해보세요.

0

1.

일단 주변이 어떤 값인지에 따라 다릅니다. concat을 안 하면 var 주변이 어떻게 되어있는 상황인건가요?

참고로 필터는 다음과 같이 줄일 수 있습니다.

주변.filter((v) => {
  return !!v && [코드표.지뢰].includes(v);
});

2.

배열[-1]은 undefined입니다.

배열[-1][0]은 에러가 납니다. undefined[0]이니까요.

배열[0][-1]은 에러가 안 납니다. a[0][-1]이 undefined이니까요.

jinw0909님의 프로필

jinw0909

질문자

2021.04.28

빠른 답변 정말 감사드립니다.

그런데 그 사이에 추가로 질문이 생겼습니다.

질문 01)

함수 선언할 때 어떤때는 function() {} (function과 소괄호 사이에 띄어쓰기 없음)처럼 쓰시고 어떤때는 function () {}  (한칸띄고 소괄호)로 쓰시는데 이건 매개변수와 상관이 있는건가요? 정해진 규칙같은게 있는지 궁금합니다.

질문 02)

카드 짝맞추기 강의중 팩토리 패턴과 프로토타입과 비교에서 프로토타입의 장점이 여러 객체를 동시에 수정가능한 점이라고 말씀해주셨는데요, 그런데 카드공장 함수만 조금 수정한다면 프로토타입을 사용하지 않고도 동시 수정이 가능하지 않은가 해서 질문드립니다.

예를들어,

function 카드공장(name, att, hp) {

     var 카드  = {

               name: name,

               att: att,

               hp: hp,

               type: '장난감'

      }

      return 카드;

};

이렇게 장난감공장 함수에서 선언된 카드라는 변수에 type: '장난감'을 추가한다면 카드공장을 통해서 리턴된 모든 객체는 type 속성으로 '장난감'을 가지게 되지 않나요? 물론 __proto__ 속성은 생략 가능하다고 하셨기 때문에 프로토타입으로 장난감을 적용해도 결과적으로 차이는 없겠지만 프로토타입을 사용해야 하는 이유를 잘 모르겠습니다. (너무 기본적인 질문인 것 같지만 막상 찾으려니 찾을수가 없어서 질문드립니다...)

-----------------------

마지막으로 카드 짝맞추기 코드 중 오타를 발견한 것 같아서 말씀드리겠습니다. 강의 마지막 부분에서 완성카드 배열을 통해 짝이 맞춰진 카드를 관리하는 부분이 있었는데요, 클로저 함수 안에서 includes 메소드를 사용해

if(클릭플래그 && !완성카드.includes(c)) {

    c.classList.toggle('flipped');

     클릭카드.push(c);

}

로 처리해서 같은 카드가 중복해서 클릭카드 배열에 들어가지 않도록 처리되었습니다.

그런데 이렇게 처리할 경우 동일한 카드를 두번 클릭해도 완성카드 배열에 들어가버려서 카드 한짝이 남아버리는 문제가 발생했습니다. (완성카드 배열은 클릭카드[0]과 클릭카드[1] 뒷면의 backgroundColor 속성을 비교 후 일치하는 경우에 div element가 들어가기 때문에 동일 카드가 두번 들어가는 것 같습니다.)

또한 그 후에 if문에서 완성카드 배열에 대해 includes 메소드가 실행되는데,  같은 카드를 연속해서 클릭시 이미 완성카드 배열에 동일 카드가 (두번) 들어가버려서 그다음부터 뒤집어지지 않는 현상이 발생했습니다.

그래서 if문 안에 있는 !완성카드.includes(c) 부분을 !클릭카드.includes(c)로 바꿧더니 잘 동작하게 되었습니다. 혹시 이 부분이 오타가 아닌가 해서 댓글로 남기게 되었습니다. 

설명을 단게별로 너무 잘 해주셔서 따라 치기만 하는데도 동작원리가 이해되는 것 같아서 정말 감사드립니다.

아직 테트리스까지 다 듣지는 않았지만 남은 강의가 더 기대됩니다.

그리고 이전 질문에 빠르게 답변해주신 점 다시한번 감사드립니다.

그럼 좋은 하루 되세요!

  

1. 띄어쓰기는 마음대로입니다. 아무 영향이 없습니다.

2. 프로토타입 없이 공장 함수로도 할 수 있긴 합니다. 다만 나중에 배우는 상속같은 것을 구현할 때는 프로토타입이 조금 더 편하긴 합니다.

3. 카드 짝맞추기 부분은 현재 유튜브에서 2021년 버전으로 강좌 진행중입니다. 말씀하신대로 그 부분은 코드가 수정되었습니다. 같은 카드를 두 번 연달아 클릭하지 못하도록요.