JavaScript가 배열되어 있습니다


152

내가 이것을 가지고 있다고 가정 해 봅시다.

var blockedTile = new Array("118", "67", "190", "43", "135", "520");

더 많은 배열 요소가 있지만 읽기 쉬운 목적으로 몇 가지가 있습니다. 어쨌든, 나는 "for"루프를 수행 할 수 있지만 맵을 클릭 할 때마다 500 개의 루프를 수행합니다. 특정 문자열이 배열에 있는지 확인하는 다른 방법이 있습니까?

답변:


247

이 시도:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}

24
IE <9와 같은 오래된 브라우저에서는 작동하지 않습니다. 이를위한 jQuery 함수가있다 : api.jquery.com/jQuery.inArray
Vinicius Pinto

5
더 빠른 방법은 현명한 비트를 반전하는 if(!!~blockedTile.indexOf('118))이 방법이 항상 true를 돌려줍니다 결과> -1과 거짓 === 결과의 경우 -1 경우
bm_i

11
@bm_i 어느 것이 빠릅 니까? 입력하는 것이 더 빠릅니까?
alex

1
indexOf()리터럴 배열에도 적용될 수 있습니다 (예 :) if (-1 == [84, 116].indexOf(event.keyCode)). Chrome 37.0.2062.122에서 테스트되었습니다.
François

2
난 항상 사용 indexOf(…) >= 0합니다. 차이가 없습니다 그리고 난 습관으로 집어 어디에서 잊지
JSDBroughton

49

앞서 언급했듯이, 브라우저가을 지원 indexOf()하면 훌륭합니다! 그렇지 않은 경우,이를 pollyfil하거나 lodash / underscore 와 같은 유틸리티 벨트에 의존해야 합니다 .

이 새로운 ES2016 추가 사항 을 추가하고 싶었습니다 (이 질문을 계속 업데이트하십시오).

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}

12
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
}

2
OP는 루프를 원하지 않았다
JNF

12

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');   
}

11

일부 브라우저는을 지원 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;
  };
}

소스 .


Javascript에서 (blockedTile의 '118')을 사용할 수 없습니까?
prabhat mishra

1
@prabhatmishra 키만 확인할 수 있습니다.
alex

9

취향에 맞게 사용하십시오.

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>



6

2019 년에하는 가장 좋은 방법은 .includes()

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(1, 2);  // false

첫 번째 매개 변수는 당신이 찾고있는 것입니다. 두 번째 매개 변수는 검색을 시작할이 배열의 색인 위치입니다.

여기에 크로스 뷰가 필요한 경우 많은 레거시 답변이 있습니다.


1
includes솔루션은 Kutyel (2016), Сергей Савельев (2017) 및 Krunal Limbad (2018)에서 동일하게 자세한 예와 참조로 답변됩니다.
CPHPython

4

이미 위에서 답변했지만 공유하고 싶었습니다.

IE에서는 작동하지 않습니다. @Mahmoud를 언급 해 주셔서 감사합니다.

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

여기에 몇 가지 참조가 있습니다. 그들은 또한 위의 Polyfill을 가지고 있습니다.


이것을 사용할 때주의하십시오. Array.includes()ES7 (ECMAScript 2017)에 도입되었으며 이전 브라우저에서는 작동하지 않습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
uxcode

3

사용 가능한 JavaScript 버전에 따라 다음을 사용할 수 있습니다 indexOf.

주어진 요소가 배열에서 발견 될 수있는 첫 번째 색인을 리턴하거나 존재하지 않는 경우 -1을 리턴합니다.

또는 some:

배열의 일부 요소가 제공된 함수로 구현 된 테스트를 통과하는지 테스트합니다.

그러나 이런 종류의 존재 검사를 많이하는 경우 Object를 사용하여 문자열 (또는 데이터로 수행중인 작업에 따라 Array뿐만 아니라 객체)을 저장하는 것이 좋습니다.


3

배열이 최상의 솔루션이 아닌 것처럼 보이기 때문에 다른 데이터 구조를 사용합니다.

배열 대신 객체를 해시 테이블로 사용하십시오.

( jsbin 에도 게시 됨 )

var arr = ["x", "y", "z"];
var map = {};
for (var k=0; k < arr.length; ++k) {
  map[arr[k]] = true;
}

function is_in_map(key) {
  try {
    return map[key] === true;
  } catch (e) {
    return false;
  }
}


function print_check(key) {
  console.log(key + " exists? - " + (is_in_map(key) ? "yes" : "no"));
}

print_check("x");
print_check("a");

콘솔 출력 :

x exists? - yes
a exists? - no

그것은 간단한 해결책입니다. 객체 지향 접근 방식에 더 관심이 있다면 Google에서 "js hashtable" 을 검색하십시오 .


3

이전 브라우저와 가장 호환되는 IMHO

Array.prototype.inArray = function( needle ){

    return Array(this).join(",").indexOf(needle) >-1;

}

var foods = ["Cheese","Onion","Pickle","Ham"];
test = foods.inArray("Lemon");
console.log( "Lemon is " + (test ? "" : "not ") + "in the list." );

배열 사본을 CSV 문자열로 변환하면 이전 브라우저에서 문자열을 테스트 할 수 있습니다.


3
배열 멤버 중 하나에 바늘이 포함되어 있지만 독점적으로 포함되어 있지 않은 경우 위양성입니다. 예를 들어 ['Lemon Pie'].inArray('Lemon')돌아올 것이다True 합니다. 당신은 ,그것을 피하기 위해 바늘을 감쌀 수도 있고 정규 표현식을 사용하여 마찬가지로 할 수도 있지만 ,비슷한 거짓 양성 이유 보다 더 모호한 것을 사용하는 것이 바람직 |합니다. 데이터 셋에 따라 다릅니다.
JSDBroughton

1

왜 Array.filter를 사용하지 않습니까?

var array = ['x','y','z'];
array.filter(function(item,index,array){return(item==YOURVAL)}).

코드에 복사하면됩니다.

Array.prototype.inArray = function (searchedVal) {
return this.filter(function(item,index,array){return(item==searchedVal)}).length==true
}

0

배열 예제에서는 PHP와 동일합니다 (in_array)

 var ur_fit = ["slim_fit", "tailored", "comfort"];
 var ur_length = ["length_short", "length_regular", "length_high"];
    if(ur_fit.indexOf(data_this)!=-1){
        alert("Value is avail in ur_fit array");
    }
    else if(ur_length.indexOf(data_this)!=-1){      
         alert("value is avail in ur_legth array"); 

    }

0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false

4
코드 조각을 게시하는 것은 답 이 아닙니다 . 그 위에 설명을 추가해야합니다.
xoxel

1
이 코드 스 니펫은 문제를 해결할 수 있지만 질문에 왜 또는 어떻게 대답하는지는 설명하지 않습니다. 제발 코드에 대한 설명을 포함 하는 정말 귀하의 게시물의 품질을 개선하는 데 도움으로. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다. 신고자 / 검토 자 : 이 답변과 같은 코드 전용 답변의 경우 공감하지 마십시오.
Luca Kiebel 2016 년

사용을 제안하는 몇 가지 답변이 이미 있습니다 includes. 이 답변은 그에 비해 추가 가치를 어떻게 제공합니까?
Boghyon Hoffmann 2016 년

0

아래 코드를 시도해 볼 수 있습니다. http://api.jquery.com/jquery.grep/를 확인하십시오.

var blockedTile = new Array("118", "67", "190", "43", "135", "520");
var searchNumber = "11878";
arr = jQuery.grep(blockedTile, function( i ) {
  return i === searchNumber;
});
if(arr.length){ console.log('Present'); }else{ console.log('Not Present'); }

arr.length가 0보다 크면 문자열이 있고 그렇지 않으면 존재하지 않는지 확인하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.