자바스크립트의 indexOf() 함수는 배열로 된 원소를 탐색하지 못하나요?

조회수 896회
const arr = [1, 2, [1, 2], 3, 4, 5];
console.log(arr.indexOf([1, 2])); // -1

위 코드를 실행시키면 인자로 주어진 값을 찾지 못했다는 의미의 -1을 반환합니다.

원래 indexOf()는 배열로 된 원소를 찾지 못하는 건가요?

객체로 된 원소({name: "Steve"} 등)도 찾는데 배열로 된 원소는 왜 못 찾는 것인지 이유가 궁금합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • indexOf()에 관한 질문이 자주 올라오네요. 여기에 적어놓았지만 indexOf()에 찾고 싶은 값의 '겉모양'을 인자로 넘기면 찾지 못합니다. 단순 문자열이든 배열이든 뭐든 참조가 동일한 뭔가를 넘기셔야 해요.

    원하시는 결과를 얻으려면 아마 이런 처리가 필요할 겁니다.

    var myArray = [1, 2]
    const arr = [5, 4, myArray, 3, 2, 1]
    console.log(arr.indexOf(myArray)) // 2
    

    아니면 underscore.js 같은 걸 써보세요.

    const arr = [5, 4, [1, 2], 3, 2, 1]
    _.indexOf(arr, [1, 2]); // 2
    
    • 답변이 늦었습니다. 자세한 설명 감사드립니다. 해당 배열을 참조하는 변수를 전달해야 하는군요. 알 수 없는 사용자 2018.10.16 11:32
  • 엽토님 답변대로 indexOf()는 탐색 대상이 object 타입인경우 값을 꺼내서 비교하는게 아니라 단순히 동등한지(= 같은 객체인지) 보기 때문에 질문하신것처럼 값만 같은 배열은 찾을 수 없습니다.

    [1, 2] == [1, 2]; // 내용물인 값이 같더라도 서로 다른 객체라서 false
    

    따라서 Array.prototype.indexOf의 내용을 재정의하거나 써드파티를 사용하지 않는 이상 불가능합니다.

    • 그런데 왜 다른 객체로 판정하는 것인가요? indexOf()에 인자로 전달할 때 새로운 배열로 할당되는 건가요? 알 수 없는 사용자 2018.10.16 11:33
    • 고렇습니다. [1, 2]는 new Array(1, 2)의 다른 표현식이니까 new를 두 번 한게 되죠. 편집요청빌런 2018.10.16 12:49

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

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

(ಠ_ಠ)
(ಠ‿ಠ)