항목이 JavaScript 배열에 있는지 확인하는 가장 좋은 방법은 무엇입니까?
개체가 배열에 있는지 확인하는 가장 좋은 방법은 무엇입니까?
이게 내가 아는 최선의 방법이야
function include(arr, obj) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == obj) return true;
}
}
console.log(include([1, 2, 3, 4], 3)); // true
console.log(include([1, 2, 3, 4], 6)); // undefined
ECMAScript 2016 현재 사용 가능
arr.includes(obj);
IE 또는 기타 오래된 브라우저를 지원하는 경우:
function include(arr,obj) {
return (arr.indexOf(obj) != -1);
}
편집: IE6, 7, 또는8 에서는 동작하지 않습니다.가장 좋은 회피책은 존재하지 않는 경우 직접 정의하는 것입니다.
Mozilla(EMA-262) 버전:
if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement /*, fromIndex */) { "use strict"; if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (len === 0) return -1; var n = 0; if (arguments.length > 0) { n = Number(arguments[1]); if (n !== n) n = 0; else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) n = (n > 0 || -1) * Math.floor(Math.abs(n)); } if (n >= len) return -1; var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); for (; k < len; k++) { if (k in t && t[k] === searchElement) return k; } return -1; }; }
Daniel James 버전:
if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (obj, fromIndex) { if (fromIndex == null) { fromIndex = 0; } else if (fromIndex < 0) { fromIndex = Math.max(0, this.length + fromIndex); } for (var i = fromIndex, j = this.length; i < j; i++) { if (this[i] === obj) return i; } return -1; }; }
roystonacid 버전:
Array.prototype.hasObject = ( !Array.indexOf ? function (o) { var l = this.length + 1; while (l -= 1) { if (this[l - 1] === o) { return true; } } return false; } : function (o) { return (this.indexOf(o) !== -1); } );
jQuery를 사용하는 경우:
$.inArray(5 + 5, [ "8", "9", "10", 10 + "" ]);
상세한 것에 대하여는, http://api.jquery.com/jQuery.inArray/ 를 참조해 주세요.
번째로 ''를 실장합니다.indexOf
자바스크립트를 아직 설치하지 않은 브라우저의 경우 JavaScript를 사용합니다.예를 들어 Erik Arvidsson의 어레이 엑스트라(관련 블로그 게시물)를 참조하십시오.그런 다음,indexOf
브라우저 지원에 대해 걱정하지 않아도 됩니다.가 약간 이 있습니다.indexOf
★★★★
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (obj, fromIndex) {
if (fromIndex == null) {
fromIndex = 0;
} else if (fromIndex < 0) {
fromIndex = Math.max(0, this.length + fromIndex);
}
for (var i = fromIndex, j = this.length; i < j; i++) {
if (this[i] === obj)
return i;
}
return -1;
};
}
길이를 저장하도록 변경되어 반복할 때마다 검색할 필요가 없습니다.하지만 그 차이는 크지 않다.범용성이 낮은 기능이 더 빠를 수 있습니다.
var include = Array.prototype.indexOf ?
function(arr, obj) { return arr.indexOf(obj) !== -1; } :
function(arr, obj) {
for(var i = -1, j = arr.length; ++i < j;)
if(arr[i] === obj) return true;
return false;
};
저는 표준 기능을 사용하고 이런 종류의 미세 최적화는 꼭 필요할 때를 위해 남겨두는 것을 선호합니다.하지만 미세 최적화에 관심이 있으시다면, 저는 코멘트에 링크된 루스터노산(roysteronacid)의 벤치마크를 어레이 내의 벤치마크 검색에 적용했습니다.그러나 이 방법은 매우 조잡하기 때문에 완전한 조사를 통해 유형이나 길이가 다른 어레이를 테스트하고 서로 다른 장소에서 발생하는 개체를 찾을 수 있습니다.
배열이 정렬되지 않은 경우 더 나은 방법은 없습니다(상기 indexOf를 사용하는 것 이외에는 동일하다고 생각합니다).배열이 정렬된 경우 다음과 같이 이진 검색을 수행할 수 있습니다.
- 배열의 중간 요소를 선택합니다.
- 찾고 있는 요소가 선택한 요소보다 더 큰가요?이 경우 어레이의 하위 절반을 삭제한 것입니다.그렇지 않으면 상위 절반을 탈락시킨 것입니다.
- 어레이의 나머지 절반의 중간 요소를 선택하고 순서 2와 같이 진행하여 나머지 절반의 어레이를 제거합니다.결국 요소를 찾거나 검토할 배열이 남아 있지 않습니다.
이진수 검색은 배열 길이의 대수에 비례하는 시간 단위로 실행되므로 각 요소를 확인하는 것보다 훨씬 빠를 수 있습니다.
[ ] . has ( obj )
가정하여.indexOf()
구현되어 있다
Object.defineProperty( Array.prototype,'has',
{
value:function(o, flag){
if (flag === undefined) {
return this.indexOf(o) !== -1;
} else { // only for raw js object
for(var v in this) {
if( JSON.stringify(this[v]) === JSON.stringify(o)) return true;
}
return false;
},
// writable:false,
// enumerable:false
})
!!! 하지 마!Array.prototype.has=function(){...
모든 배열에 열거 가능한 요소를 추가하고 js가 끊어지기 때문입니다.
//use like
[22 ,'a', {prop:'x'}].has(12) // false
["a","b"].has("a") // true
[1,{a:1}].has({a:1},1) // true
[1,{a:1}].has({a:1}) // false
두 번째 arg(표준)를 사용하면 참조 대신 값에 의한 비교를 강제할 수 있다.
원시 개체 비교
[o1].has(o2,true) // true if every level value is same
목적에 따라 다르죠.웹용으로 프로그래밍하는 경우indexOf
Internet Explorer 6에서는 지원되지 않습니다(이 중 많은 수가 아직 사용되고 있습니다).또는 조건부 사용을 실시합니다.
if (yourArray.indexOf !== undefined) result = yourArray.indexOf(target);
else result = customSlowerSearch(yourArray, target);
indexOf
는 네이티브 코드로 코딩되어 있기 때문에 JavaScript에서 실행할 수 있는 어떤 것보다도 빠릅니다(배열이 적절한 경우 바이너리 검색/디컷 제외).주의: 취향의 문제이지만, 저는 이 질문을 하고 싶습니다.return false;
루틴이 끝날 때 진정한 부울을 반환하려면...
여기 메타지식이 있습니다.어레이로 무엇을 할 수 있는지 알고 싶다면 매뉴얼을 참조해 주세요.여기 Mozilla의 Array 페이지가 있습니다.
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array
Javascript 1.6에 추가된 indexOf에 대한 참조가 표시됩니다.
개체가 javascript에서 배열인지 확인하는 강력한 방법은 다음과 같습니다.
다음은 xa.js 프레임워크의 두 가지 기능으로,utils = {}
''' 。어레이를 올바르게 검출하는 데 도움이 됩니다.
var utils = {};
/**
* utils.isArray
*
* Best guess if object is an array.
*/
utils.isArray = function(obj) {
// do an instanceof check first
if (obj instanceof Array) {
return true;
}
// then check for obvious falses
if (typeof obj !== 'object') {
return false;
}
if (utils.type(obj) === 'array') {
return true;
}
return false;
};
/**
* utils.type
*
* Attempt to ascertain actual object type.
*/
utils.type = function(obj) {
if (obj === null || typeof obj === 'undefined') {
return String (obj);
}
return Object.prototype.toString.call(obj)
.replace(/\[object ([a-zA-Z]+)\]/, '$1').toLowerCase();
};
오브젝트가 배열 내에 있는지 확인하고 싶다면 다음 코드도 포함합니다.
/**
* Adding hasOwnProperty method if needed.
*/
if (typeof Object.prototype.hasOwnProperty !== 'function') {
Object.prototype.hasOwnProperty = function (prop) {
var type = utils.type(this);
type = type.charAt(0).toUpperCase() + type.substr(1);
return this[prop] !== undefined
&& this[prop] !== window[type].prototype[prop];
};
}
마지막으로 in_array 함수는 다음과 같습니다.
function in_array (needle, haystack, strict) {
var key;
if (strict) {
for (key in haystack) {
if (!haystack.hasOwnProperty[key]) continue;
if (haystack[key] === needle) {
return true;
}
}
} else {
for (key in haystack) {
if (!haystack.hasOwnProperty[key]) continue;
if (haystack[key] == needle) {
return true;
}
}
}
return false;
}
언급URL : https://stackoverflow.com/questions/143847/best-way-to-find-if-an-item-is-in-a-javascript-array
'programing' 카테고리의 다른 글
enumerate()는 무슨 뜻입니까? (0) | 2022.11.26 |
---|---|
연결된 데이터베이스가 MariaDB인지 MySQL인지 어떻게 알 수 있습니까? (0) | 2022.11.26 |
약속.all: 해결된 값의 순서 (0) | 2022.10.29 |
1234 == '1234 검정'이 참으로 평가되는 이유는 무엇입니까? (0) | 2022.10.29 |
포어치 인덱스는 어떻게 찾죠? (0) | 2022.10.29 |