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
직접적이지는 않지만 오래된 브라우저의 경우 폴리 필이 필요하지 않은을 사용할 수도 있습니다 .
많은 프레임 워크에서도 비슷한 방법을 제공합니다.
- jQuery :
$.inArray(value, array, [fromIndex])
- Underscore.js :
_.contains(array, value)
(로도 별칭_.include
과_.includes
) - Dojo 툴킷 :
dojo.indexOf(array, value, [fromIndex, findLast])
- 원기:
array.indexOf(value)
- MooTools :
array.indexOf(value)
- 떡킷 :
findValue(array, value)
- MS 아약스 :
array.indexOf(value)
- 내선 :
Ext.Array.contains(array, value)
- Lodash :
_.includes(array, value, [from])
(_.contains
4.0.0 이전) - 람다 :
R.includes(value, array)
일부 프레임 워크에서는이를 함수로 구현하고 다른 프레임 워크는 함수를 배열 프로토 타입에 추가합니다.
답변
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;
};
}