[javascript] 배열에 JavaScript의 값이 포함되어 있는지 어떻게 확인합니까?

JavaScript 배열에 값이 포함되어 있는지 확인하는 가장 간결하고 효율적인 방법은 무엇입니까?

이것이 내가 아는 유일한 방법입니다.

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

이것을 달성하는 더 좋고 간결한 방법이 있습니까?

이것은 스택 오버플로 질문과 매우 밀접한 관련이 있습니다 . JavaScript 배열에서 항목을 찾는 가장 좋은 방법은 무엇입니까? 를 사용하여 배열에서 객체 찾기를 처리합니다 indexOf.



답변

현대 브라우저가 Array#includes않는, 정확히 있고 광범위하게 지원되는 IE를 제외한 모든 사람이 :

console.log(['joe', 'jane', 'mary'].includes('jane')); //true

Array#indexOf직접적이지는 않지만 오래된 브라우저의 경우 폴리 필이 필요하지 않은을 사용할 수도 있습니다 .


많은 프레임 워크에서도 비슷한 방법을 제공합니다.

일부 프레임 워크에서는이를 함수로 구현하고 다른 프레임 워크는 함수를 배열 프로토 타입에 추가합니다.


답변

2019 년 업데이트 :이 답변은 2008 년 (11 세)부터이며 최신 JS 사용과 관련이 없습니다. 약속 된 성능 향상은 당시의 브라우저에서 수행 된 벤치 마크를 기반으로했습니다. 최신 JS 실행 컨텍스트와 관련이 없을 수 있습니다. 쉬운 해결책이 필요하면 다른 답변을 찾으십시오. 최상의 성능이 필요한 경우 관련 실행 환경에서 벤치마킹하십시오.

다른 사람들이 말했듯이 배열을 반복하는 것이 가장 좋은 방법 일 수 있지만 JavaScript에서 루프를 줄이는 것이 가장 빠른 방법 이라는 것이 입증되었습니다while . 따라서 다음과 같이 코드를 다시 작성하십시오.

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

물론 Array 프로토 타입을 확장 할 수도 있습니다.

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

이제 다음을 간단히 사용할 수 있습니다.

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false


답변

indexOf 어쩌면 “ECMA-262 표준에 대한 자바 스크립트 확장입니다. 표준의 다른 구현에는 없을 수 있습니다.”

예:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS 마이크로 소프트는 않습니다 하지 대체 어떤 종류의 제공 이에,하지만 당신은 Internet Explorer의 배열 (지원을하지 않는 다른 브라우저에 유사한 기능을 추가 할 수 있습니다 indexOf당신이 원하는 경우)에, A와 빠른 Google 검색은 계시 (예를 들어, 이 일을 ).


답변

ECMAScript 7에서 소개 Array.prototype.includes합니다.

다음과 같이 사용할 수 있습니다 :

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

선택적 두 번째 인수도 허용합니다 fromIndex.

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

달리 indexOf사용하는, 엄격한 평등 비교 , includes사용 비교 SameValueZero의 평등 알고리즘을. 즉, 배열에 다음이 포함되어 있는지 감지 할 수 있습니다 NaN.

[1, 2, NaN].includes(NaN); // true

또한 달리 indexOf, includes인덱스 누락 건너 뛰지 않습니다 :

new Array(5).includes(undefined); // true

현재 초안이지만 모든 브라우저에서 작동 하도록 폴리 필 할 수 있습니다 .


답변

상단 답변은 기본 유형을 가정하지만 배열에 특성 이있는 객체 가 있는지 확인하려면 Array.prototype.some () 은 매우 우아한 솔루션입니다.

const items = [ {a: '1'}, {a: '2'}, {a: '3'} ]

items.some(item => item.a === '3')  // returns true
items.some(item => item.a === '4')  // returns false

그것에 대한 좋은 점은 요소가 발견되면 반복이 중단되어 불필요한 반복 사이클이 절약된다는 것입니다.

또한 if부울을 반환하므로 명령문 에 잘 맞습니다 .

if (items.some(item => item.a === '3')) {
  // do something
}

* 의견에서 제임스가 지적한 바와 같이, 2018 년 9 월이 답변 시점에서 caniuse.com 지원 표Array.prototype.some() 가 완전히 지원됩니다.


답변

다음과 같이 배열을 정의했다고 가정 해 봅시다.

const array = [1, 2, 3, 4]

아래에 세 가지가 있는지 확인하는 방법 3이 있습니다. 모두 true또는을 반환합니다 false.

기본 배열 방법 (ES2016부터) ( 호환성 표 )

array.includes(3) // true

사용자 정의 배열 방법으로 (ES2016 이전)

// Prefixing the method with '_' to avoid name clashes
Object.defineProperty(Array.prototype, '_includes', { value: function (v) { return this.indexOf(v) !== -1 }})
array._includes(3) // true

간단한 기능

const includes = (a, v) => a.indexOf(v) !== -1
includes(array, 3) // true


답변

여기의 자바 스크립트 1.6 호환 의 구현 Array.indexOf:

if (!Array.indexOf) {
    Array.indexOf = [].indexOf ?
        function(arr, obj, from) {
            return arr.indexOf(obj, from);
        } :
        function(arr, obj, from) { // (for IE6)
            var l = arr.length,
                i = from ? parseInt((1 * from) + (from < 0 ? l : 0), 10) : 0;
            i = i < 0 ? 0 : i;
            for (; i < l; i++) {
                if (i in arr && arr[i] === obj) {
                    return i;
                }
            }
            return -1;
        };
}