배열이 JavaScript의 값이 포함되어 있는지 확인하려면 어떻게해야합니까?
질문
JavaScript 배열에 값이 포함되어 있는지 확인하는 가장 간결하고 효율적인 방법은 무엇입니까?
이것은 내가하는 유일한 방법입니다 :
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
이것을 성취 할 수있는 더 나은 간결한 방법이 있습니까?
답변
현대 브라우저에는 배열 # 포함, 즉 정확히 그렇게되는 모든 사람이 널리 지원됩니다.
console.log ([ 'Joe', 'Jane', 'Mary']를 포함합니다 ( 'Jane');//진실
또한 Direct # indexof를 사용할 수도 있지만 오래된 브라우저에 대해서는 폴리필이 필요하지 않습니다.
console.log ([ 'Joe', 'Jane', 'Mary'] indexof ( 'Jane')> = 0);//진실
많은 프레임 워크도 유사한 방법을 제공합니다.
jQuery : $ .inarray (값, 배열, [fromIndex]) Underscore.js : _.contains (배열, 값) (_.include 및 _.includes 로의 별칭) dojo toolkit : dojo.indexof (배열, 값, [fromIndex, FromIndex]) 프로토 타입 : array.indexof (값) mootools : array.indexof (값) Mochikit : FindValue (배열, 가치) ms ajax : array.indexof (값) ext : ext.array.contains (배열, 값) Lodash : _.includes (배열, 값, [from]) (_.contains 4.0.0의 경우) ramda : r.includes (가치, 배열)
일부 프레임 워크는이 기능을 함수로 구현하며 다른 파일은 어레이 프로토 타입에 함수를 추가합니다.
답변
업데이트 2019 년 부터이 답변은 2008 년 (11 세!)이며 현대 JS 사용법과 관련이 없습니다.약속 된 성과 개선은 그 시간의 브라우저에서 수행 된 벤치 마크를 기반으로했습니다.현대 JS 실행 컨텍스트와 관련이 없을 수도 있습니다.쉬운 솔루션이 필요한 경우 다른 답변을 찾으십시오.최상의 성능이 필요한 경우 관련 실행 환경에서 벤치 마크하십시오.
다른 사람들이 말했듯이, 배열을 통한 반복은 아마도 가장 좋은 방법 일 것임을 입증했지만 루프는 JavaScript에서 반복하는 가장 빠른 방법이라는 것입니다.따라서 다음과 같이 코드를 다시 작성할 수 있습니다.
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}
물론 배열 프로토 타입을 확장 할 수도 있습니다.
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 표준에 대한 JavaScript 확장자입니다. 이와 같이 표준의 다른 구현에서는 존재하지 않을 수 있습니다."
예시:
[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1
Afaics Microsoft는이 옵션에 대한 대안을 제공하지는 않지만 빠른 Google 검색이 밝혀 졌을 때 Internet Explorer (Internet Explorer)의 배열 및 InternalSof를 지원하지 않는 기타 브라우저와 유사한 기능을 추가 할 수 있습니다 (예 :이하나).
답변
상위 답변은 기본 유형을 가정하지만 배열에 일부 특성이있는 객체가 포함되어 있는지 확인하려면 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 월, Array.Prototype.Some ()이 완전히 지원됩니다. Caniuse.com 지원 테이블
답변
ECMAScript 7은 Array.Prototype.inCludes를 소개합니다.
다음과 같이 사용할 수 있습니다.
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
그것은 또한 선택적 두 번째 인수를 허용합니다.
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
엄격한 평등 비교를 사용하는 Indexof와 달리 SomeValuezero 평등 알고리즘을 사용하는 비교를 포함합니다.이는 배열이 NaN이 포함되어 있는지 확인할 수 있음을 의미합니다.
[1, 2, NaN].includes(NaN); // true
또한 Indexof와 달리 누락 된 인덱스를 건너 뛰지 않습니다.
new Array(5).includes(undefined); // true
현재 그것은 여전히 초안이지만 모든 브라우저에서 작업 할 수 있도록 폴리 필딩이 가능합니다.
답변
다음과 같이 배열을 정의했음을 알려 봅시다.
const array = [1, 2, 3, 4]
아래에는 3 가지가 있는지 여부를 확인하는 세 가지 방법이 있습니다.그들 모두는 true 또는 false 중 하나를 반환합니다.
기본 배열 방법 (ES2016 이후) (호환성 테이블)
array.includes(3) // true
맞춤 배열 방법으로 (Pre 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
출처:https://stackoverflow.com/questions/237104/how-do-i-check-if-an-array-includes-a-value-in-javascript
최근댓글