여러 개의 string을 하나의 변수에 지정하고 싶은데 오류가 생깁니다. - JavaScript

조회수 648회
    const arr = ['a', 'b', 'c', 'd', 'e'];
    var x = "b" || "d" || "g" || "h" || "z";
    const the_number_of_x = arr.filter(i => i === x).length;
    if (the_number_of_x === 2) {
        console.log("success!")
    } else {
        console.log("fail!")
    }

x라는 변수에 "b""d"가 있고 arr에도 'b', 'd' 총 2개가 있으니까 the_number_of_x2가 되는 거 아닌가요? 그런데 어째서 "success!"가 아닌 "fail!"이 나오는지 모르겠습니다.

알려주시면 감사하겠습니다.

  • `var x = 'bdghz'; const the_number_of_x = arr.filter(i => x.includes(i)).length;` 알 수 없는 사용자 2021.3.11 07:45

1 답변

  • 1. console.log(x) 해보시면 x는 항상 "b"입니다.

    자바스크립트에서 A || B는, "A가 쓸만하면 A, 아니면 B"를 뜻합니다.
    그래서 "b" || "d" || "g" || "h" || "z"는 항상 "b"가 됩니다.
    뒤에 || 연산이 몇번 정의돼 있든 상관 없이 "b"는 쓸만한(truthy한) 자료거든요.


    2. 여러 개의 string을 하나의 변수에 지정한 것은 사실 arr입니다.

    여러 개의 문자열을 하나의 변수에 담으려면 어떻게 할까요? 크게 두 가지 방법으로 합니다. 여러 개의 자료를 담는 iterable한 또는 enumeratable한 자료형에 여러 개의 문자열을 담든지, 아니면 특정 구분자로 여러 문자열을 이어붙인 하나의 문자열을 쓰든지.

    첫번째 방법이 바로 arr이고, 두번째 방법은 이를테면 이런 식입니다.

    let x = "b|d|g|h|z";
    let y = x.split('|'); // 결국 y는 배열 → iteratable 한 자료
    

    3. 그래서 원하는 작업은 어떻게 하느냐구요? arr 같은 걸 하나 더 만들어서 비교하면 됩니다.

    arr이 이미 여러 개의 문자열을 '지정한' 하나의 변수거든요. 비슷한 걸 하나 더 만든 다음 둘을 비교하면 되겠지요.

    // 요약하자면 교집합을 구하는 것이다. 여기를 베꼈음: https://stackoverflow.com/a/1885569
    const arr = ['a', 'b', 'c', 'd', 'e'];
    let x = ["b", "d", "g", "h", "z"];
    let arr_and_x = arr.filter(function (n) {
        return x.indexOf(n) !== -1;
    });
    console.log(arr_and_x.length == 2 ? 'success!' : 'failed!');
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)