indexOf와 배열의 findIndex 함수의 차이점


125

두 함수 indexOf의 차이점과 배열에서 Index 찾기 사이에 혼란 스럽습니다.

문서에 따르면

findIndex-predicate가 true 인 배열에서 첫 번째 요소의 인덱스를 반환하고 그렇지 않으면 -1을 반환합니다.

indexOf-배열에서 처음 나타나는 값의 인덱스를 반환합니다.


4
차이점은 하나는 함수를 인수로 사용한다는 것입니다 (전체 값 대신 특정 하위 문자열이있는 값의 첫 번째 발생을 찾는 것과 같이보다 정교한 찾기를 가능하게 함). 다시 찾고 있습니다. 실제로 나쁜 질문은 아닙니다. 설명이없는 반대표는 반대 투표가 가능해야합니다.
Tim Consolazio

때로는 언어 사양 (예 : ECMA-262)으로 시작하여 다른 자료로 간격을 채우는 것이 가장 좋습니다. Array.prototype.indexOf (searchElement [, fromIndex])Array.prototype.findIndex (predicate [, thisArg]) .
RobG

감사합니다 팀과 RobG
라훌 싱

답변:


195

주요 차이점은 다음 기능의 매개 변수입니다.

  • Array.prototype.indexOf()첫 번째 매개 변수로 을 예상합니다 . 따라서 기본 유형 (문자열, 숫자 또는 부울)의 배열에서 인덱스를 찾는 것이 좋습니다 .

  • Array.prototype.findIndex()기대 콜백 첫번째 파라미터로한다. 원시 유형이 아닌 배열 (예 : 객체)의 인덱스가 필요하거나 찾기 조건이 단순한 값보다 더 복잡한 경우이 옵션을 사용하십시오.

두 경우의 예는 링크를 참조하십시오.


4
누군가가 js의 기본 유형을 궁금해하는 경우에는 문자열, 숫자, 부울과 같은 것입니다.
John Lee

3
참고 indexOf개체를 발견하기 위해 노력할 것입니다. 값이 아닌 단일 Object를 받아들이고 값이 아닌 동등성으로 비교한다는 구별을 얻는 것이 중요합니다. Mozilla 문서 별 : "또는 찾기 조건이 단일 값 또는 참조보다 더 복잡합니다"팔다리 만 포함 indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). 하도록 findIndex설명을 수정하여 원래 길을 잃었 기 때문에이를 수정하십시오. 감사!
brokenalarms

2
@brokenalarms 사실이지만 배열의 실제 개체에 대한 참조가있는 경우에만 해당됩니다. 예를 들어, 객체가 같은 것처럼 보이지만 [{a:1}].indexOf({a:1})반환합니다 -1. 이 정보가 혼란 스러울 수 있으므로 답변에 도움이되는지 확실하지 않습니다. 정확한 언어 동작에 대해 더 알고 싶다면 사양을 읽어야합니다.
str

또한 indexOf ()는 완전 항등을 사용하여 searchElement를 Array의 요소와 비교합니다 (=== 또는 triple-equals 연산자에서 사용하는 것과 동일한 방법).
immirza

가치는 그러나 지적 .indexOf(NaN)항상 반환 -1하기 때문에 NaN==NaN항상 false. NaN 입니다 때문에 원시적 형이 typeof NaN있다 number등이다 nullundefined내가 말을 피하기 위해이 개정 할 수 있도록, indexOf기본 유형에 작품을
마태 복음

13

FindIndex는 조건 자와 일치하는 첫 번째 요소를 찾으려는 경우 유용합니다. W3C의 예에서 고객의 나이가 18 세 이상이면 숫자와 일치 항목이 있습니다.

var ages = [3, 10, 18, 20];

function checkAdult(age) {
    return age >= 18;
}

console.log(ages.findIndex(checkAdult));

콘솔:

2

Array의 indexOf 함수를 사용하여 정확한 요소 인덱스를 찾을 수 있지만 조건자를 전달할 수는 없습니다. 특정 요소를 찾으려면 더 빠릅니다.

var ages = [3, 10, 18, 20];
console.log(ages.indexOf(10));

보고:

1

인덱스 카운팅은 0에서 시작하므로 첫 번째 요소 인덱스는 0입니다.


4

주요 차이점은 다음 기능의 매개 변수입니다.

-> Array.prototype.indexOf () :

   var fruits = ["Banana", "Orange", "Apple", "Mango"];
   var a = fruits.indexOf("Apple");
   The result of a will be: 2

-> Array.prototype.findIndex () :

       var ages = [3, 10, 18, 20];

       function checkAdult(age) {
        return age >= 18;
       }

       function myFunction() {
         document.getElementById("demo").innerHTML = 
         ages.findIndex(checkAdult);
       }

       The result will be: 2

4

다음을 사용할 수도 있습니다 includes.

[1, 2, 3].includes(2);      // true
[1, 2, 3].includes(4);      // false
[1, 2, 3].includes(3, 3);   // false

그러나 나는 indexOf방법을 선호합니다 .

var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
  // found it!
}

1
또한 IE 용 polyfill이 필요합니다
MJB

indexOf훨씬 빠릅니다.
eozzy

4

또 다른 차이점은 findIndex ()를 사용 하면 사용자 가 일부 함수를 적용 하고 테스트를 통과 한 배열의 요소를 찾을 수 있다는 것입니다.

그러나 indexOf () 연산자도 마찬가지입니다 . 사용자는 특정 요소가 배열에 존재하는지 여부를 확인할 수 있습니다.


3

단순-어떤 종류의 배열 구조를 사용하고 있습니까?

  • 객체의 배열이면 findIndex();
  • 그렇지 않으면 indexOf().

" 오렌지 키를 사용하여 객체 배열 에서 인덱스를 찾고 싶습니다 .

let fruits = [
   { type: "Apple", quantity: 9 },
   { type: "Banana", quantity: 2},
   { type: "Orange", quantity: 8},
   { type: "Pear", quantity: 777}
];

let myIndex = fruits.findIndex(fruit => fruit.type === "Orange"); // Returns 2.

" 간단한 배열 에서 색인을 찾고 싶습니다 ."

let fruits = [ "Apple", "Banana", "Pear", "Orange"];

let index = fruits.indexOf("Orange"); // Returns 3.

0

아래 코드를 시도해 볼 수 있습니다.

let city = ['Delhi', 'mumbai']
const a = city.findIndex((item) => 
item.toLowerCase()==='delhi')
console.log(a) // returns 0

let c = city.indexOf('mumbai') // returns 1
console.log(c)

이 코드는 '초보자'에게 매우 간단하고 이해하기 쉽기 때문에 설명이 필요하지 않다고 생각합니다. 또한 초보자는 복잡한 코드를 이해하는 데 어려움이있어서 간단하게 만들었습니다. 그러니 제 의도를 이해하지 못한 채 저품질이라고 말하지 마세요.
Gulsan Borbhuiya

시스템에서 표시 한 저품질을 찾지 못했습니다.
Gulsan Borbhuiya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.