배열에 요소가 있는지 확인합니다.
이것을 확인하기 위해서 사용하고 있는 기능은 다음과 같습니다.
function inArray(needle,haystack)
{
var count=haystack.length;
for(var i=0;i<count;i++)
{
if(haystack[i]===needle){return true;}
}
return false;
}
그건 효과가 있다.내가 찾고 있는 것은 이것을 할 수 있는 더 좋은 방법이 없을까 하는 것이다.
ECMAScript 2016은 어레이를 위한 방법을 통합하여 문제를 해결하므로 현재 선호되고 있습니다.
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(1, 2); // false (second parameter is the index position in this array at which to begin searching)
2018년 7월 현재, 이것은 거의 모든 주요 브라우저에 구현되어 있으며, 오래된 브라우저를 지원해야 할 경우 폴리필을 사용할 수 있습니다.
편집: 배열 내의 항목이 개체일 경우 false가 반환됩니다.이는 JavaScript에서 유사한 오브젝트가 두 개의 다른 오브젝트이기 때문입니다.
코드:
function isInArray(value, array) {
return array.indexOf(value) > -1;
}
실행:
isInArray(1, [1,2,3]); // true
갱신(2017년):
ECMAScript 2016(ES7) 표준을 따르는 최신 브라우저에서는 Array.protype.includes 함수를 사용할 수 있습니다.이 기능을 사용하면 항목이 배열에 있는지 여부를 보다 쉽게 확인할 수 있습니다.
const array = [1, 2, 3];
const value = 1;
const isInArray = array.includes(value);
console.log(isInArray); // true
사용방법:
haystack.indexOf(needle) >= 0
오래된 Internet Explorer(< IE9)를 지원하려면 현재 코드를 회피책으로 포함해야 합니다.
목록이 정렬되지 않은 경우 모든 값을 Needle과 비교해야 합니다.따라서 솔루션과indexOf실행할 필요가 있다n/2평균적인 비교입니다.하지만, 그 이후로는indexOf는 임베디드 방식입니다.추가 최적화를 사용할 수 있으며 실제로는 조금 더 빠릅니다.사용하시는 어플리케이션이 리스트에서 자주 검색하거나(예를 들어 초당 1000회), 리스트가 매우 큰 경우(예를 들어 10만 엔트리로), 속도 차이는 문제가 되지 않습니다.
Google Chrome 52에서 여러 번 벤치마크를 했지만, 다른 브라우저의 콘솔에 복사 붙여넣기를 자유롭게 할 수 있습니다.
~ 1500밀리초, 포함(폴리필 사용시~2700밀리초)
var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;
var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(array.includes("test") === true){ result++; }
}
console.log(new Date().getTime() - start);
최대 1050 밀리초, index Of
var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;
var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(array.indexOf("test") > -1){ result++; }
}
console.log(new Date().getTime() - start);
최대 650 밀리초, 커스텀 기능
function inArray(target, array)
{
/* Caching array.length doesn't increase the performance of the for loop on V8 (and probably on most of other major engines) */
for(var i = 0; i < array.length; i++)
{
if(array[i] === target)
{
return true;
}
}
return false;
}
var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;
var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(inArray("test", array) === true){ result++; }
}
console.log(new Date().getTime() - start);
단일 라인 코드..true 또는 false가 반환됩니다.
!!(arr.indexOf("val")+1)
사용할 수 있습니다.indexOf그러나 Internet Explorer의 마지막 버전에서 제대로 작동하지 않습니다.코드:
function isInArray(value, array) {
return array.indexOf(value) > -1;
}
실행:
isInArray(1, [1,2,3]); // true
다음 코드를 사용하는 것이 좋습니다.
function inArray(needle, haystack) {
var length = haystack.length;
for (var i = 0; i < length; i++) {
if (haystack[i] == needle)
return true;
}
return false;
}
ECMAScript6에서는 Set을 사용할 수 있습니다.
var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
언더스코어.js 라이브러리의 _contains 함수를 사용하면 다음과 같이 할 수 있습니다.
if (_.contains(haystack, needle)) {
console.log("Needle found.");
};
lodash에서는 _.includes(_.contains의 별칭도 있음)를 사용할 수 있습니다.
전체 어레이를 검색할 수 있습니다.
_.includes([1, 2, 3], 1); // true
시작 인덱스에서 어레이를 검색할 수 있습니다.
_.includes([1, 2, 3], 1, 1); // false (begins search at index 1)
문자열 검색:
_.includes('pebbles', 'eb'); // true (string contains eb)
또, 오브젝트의 단순한 어레이를 체크할 수 있습니다.
_.includes({ 'user': 'fred', 'age': 40 }, 'fred'); // true
_.includes({ 'user': 'fred', 'age': false }, false); // true
마지막 케이스에서 주의할 점은 문자열, 숫자 및 부울란과 같은 원시 요소에 대해 작동하지만 배열 또는 개체를 검색할 수 없다는 것입니다.
_.includes({ 'user': 'fred', 'age': {} }, {}); // false
_.includes({ 'user': [1,2,3], 'age': {} }, 3); // false
언급URL : https://stackoverflow.com/questions/7378228/check-if-an-element-is-present-in-an-array
'programing' 카테고리의 다른 글
| 함수 내부에서 변수를 수정해도 변경되지 않는 이유는 무엇입니까? - 비동기 코드 참조 (0) | 2022.12.10 |
|---|---|
| MySQL 테이블 업데이트 및 중복 항목 무시 (0) | 2022.12.10 |
| Python 함수의 소스코드는 어떻게 얻을 수 있나요? (0) | 2022.12.10 |
| [ Information Schema COLUNS ]테이블의 컬럼 유형 (0) | 2022.12.10 |
| MySQL: 잘못된 그룹 함수 사용 (0) | 2022.12.10 |