내가 이것을 가지고 있다고 가정 해 봅시다.
var blockedTile = new Array("118", "67", "190", "43", "135", "520");
더 많은 배열 요소가 있지만 읽기 쉬운 목적으로 몇 가지가 있습니다. 어쨌든, 나는 “for”루프를 수행 할 수 있지만 맵을 클릭 할 때마다 500 개의 루프를 수행합니다. 특정 문자열이 배열에 있는지 확인하는 다른 방법이 있습니까?
답변
이 시도:
if(blockedTile.indexOf("118") != -1)
{
// element found
}
답변
앞서 언급했듯이, 브라우저가을 지원 indexOf()
하면 훌륭합니다! 그렇지 않은 경우,이를 pollyfil하거나 lodash / underscore 와 같은 유틸리티 벨트에 의존해야 합니다 .
이 새로운 ES2016 추가 사항 을 추가하고 싶었습니다 (이 질문을 계속 업데이트하십시오).
Array.prototype.includes ()
if (blockedTile.includes("118")) {
// found element
}
답변
function in_array(needle, haystack){
var found = 0;
for (var i=0, len=haystack.length;i<len;i++) {
if (haystack[i] == needle) return i;
found++;
}
return -1;
}
if(in_array("118",array)!= -1){
//is in array
}
답변
Underscore.js 사용
그것은 크로스 브라우저 준수 와 데이터가 정렬되어있는 경우 이진 검색을 수행 할 수 있습니다.
_.indexOf
_.indexOf (array, value, [isSorted]) 배열에서 값을 찾을 수있는 인덱스를 반환하거나 값이 배열에 없으면 -1을 반환합니다. 누락되지 않은 경우 native indexOf 함수를 사용합니다. 큰 배열로 작업 중이고 배열이 이미 정렬되어 있다는 것을 알고 있다면 isSorted에 대해 더 빠른 이진 검색을 사용하려면 true를 전달하십시오.
예
//Tell underscore your data is sorted (Binary Search)
if(_.indexOf(['2','3','4','5','6'], '4', true) != -1){
alert('true');
}else{
alert('false');
}
//Unsorted data works to!
if(_.indexOf([2,3,6,9,5], 9) != -1){
alert('true');
}else{
alert('false');
}
답변
일부 브라우저는을 지원 Array.indexOf()
합니다.
그렇지 않은 경우 Array
프로토 타입을 통해 오브젝트를 확장 할 수 있습니다 .
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) // shortcut for verifying if it's NaN
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;
};
}
소스 .
답변
취향에 맞게 사용하십시오.
var blockedTile = [118, 67, 190, 43, 135, 520];
// includes (js)
if ( blockedTile.includes(118) ){
console.log('Found with "includes"');
}
// indexOf (js)
if ( blockedTile.indexOf(67) !== -1 ){
console.log('Found with "indexOf"');
}
// _.indexOf (Underscore library)
if ( _.indexOf(blockedTile, 43, true) ){
console.log('Found with Underscore library "_.indexOf"');
}
// $.inArray (jQuery library)
if ( $.inArray(190, blockedTile) !== -1 ){
console.log('Found with jQuery library "$.inArray"');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
답변
if(array.indexOf("67") != -1) // is in array