PHP의 in_array ()에 해당하는 JavaScript


223

JavaScript에서 한 배열의 값을 비교하여 다른 배열에 있는지 확인하는 방법이 있습니까?

PHP의 in_array기능과 비슷 합니까?

답변:


258

아니요, 없습니다. 이러한 이유로 가장 인기있는 라이브러리는 유틸리티 패키지에 하나와 함께 제공됩니다. 예제는 jQuery의 inArray 와 Prototype의 Array.indexOf 를 확인하십시오 .

jQuery의 구현은 예상대로 간단합니다.

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

깔끔한 양의 배열 요소를 다루는 경우 위의 방법으로 멋지게 할 수 있습니다.

편집 : 으악. 배열이 다른 배열 안에 있는지 확인하고 싶지 않은지도조차 알지 못했습니다. PHP 문서에 따르면 이것은 PHP의 예상되는 동작입니다 in_array.

$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array('p', 'h'), $a)) {
    echo "'ph' was found\n";
}

if (in_array(array('f', 'i'), $a)) {
    echo "'fi' was found\n";
}

if (in_array('o', $a)) {
    echo "'o' was found\n";
}

// Output:
//  'ph' was found
//  'o' was found

Chris와 Alex가 게시 한 코드는이 동작을 따르지 않습니다. Alex는 Prototype의 indexOf 공식 버전이며 Chris는 PHP와 비슷 array_intersect합니다. 이것은 당신이 원하는 것을합니다 :

function arrayCompare(a1, a2) {
    if (a1.length != a2.length) return false;
    var length = a2.length;
    for (var i = 0; i < length; i++) {
        if (a1[i] !== a2[i]) return false;
    }
    return true;
}

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(typeof haystack[i] == 'object') {
            if(arrayCompare(haystack[i], needle)) return true;
        } else {
            if(haystack[i] == needle) return true;
        }
    }
    return false;
}

그리고 이것에 대한 위의 테스트 :

var a = [['p','h'],['p','r'],'o'];
if(inArray(['p','h'], a)) {
    alert('ph was found');
}
if(inArray(['f','i'], a)) {
    alert('fi was found');
}
if(inArray('o', a)) {
    alert('o was found');
}  
// Results:
//   alerts 'ph' was found
//   alerts 'o' was found

Array 프로토 타입을 의도적으로 확장하지는 않았는데, 일반적으로 그렇게하는 것은 좋지 않습니다.


1
jQuery.inArray()부울을 반환 하지 않습니다 . 발견 된 요소의 색인 또는 발견되지 않은 경우 -1을 리턴합니다.
Brad Kent

높은 등급으로 인해 답변을 오래된 것으로 표시해야합니다.
Gerfried


74

현재 Array.prototype.includes:

contains () 메서드는 배열에 특정 요소가 포함되어 있는지 확인하여 적절하게 true 또는 false를 반환합니다.

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

통사론

arr.includes(searchElement)
arr.includes(searchElement, fromIndex)

66

Array.indexOfJavaScript 1.6에서 도입되었지만 이전 브라우저에서는 지원되지 않습니다. 고맙게도 Mozilla의 문제 는 당신을 위해 모든 노력 을 다했으며 호환성을 위해 이것을 제공했습니다.

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

스크립팅의 즐거움을위한 편리한 사용 스 니펫도 있습니다.


이것은 이미 여기에 게시 된 링크 / 코드의 더 좋고 안전하고 더 나은 구현입니다. 사양은 건초 더미 내부의 배열을 검사 할 필요가 없으며 OP가 원하는 것입니다.
Paolo Bergantino

3
또한, 목적은 this.length >>> 0무엇입니까? 이것이 숫자 유형으로 변환됩니까?
harto

3
Array.indexOf이제 ECMAScript Fifth Edition에서 표준화되었으므로 적절한 '기본'방식으로 간주해야합니다. 그래도 오래된 브라우저에서이 백업을 스니핑하고 오랫동안 제공해야합니다. @harto : 예, this.length부호없는 32 비트 정수로 표현할 수있는 Number 로 변환 됩니다. 기본 Array은이 길이를 이미 준수하는 길이 만 가질 수 있지만 스펙 Array.prototype은 그렇지 않은 기본 JS 오브젝트에서 메소드를 호출 할 수 있다고 명시합니다 Array. 이것과 다른 논란의 여지 확인 사항은 절대적인 사양 준수를 보장하는 것입니다.
bobince

3
- 가능한 다른 polyfill 버전은 모질라에서 직접있다 developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
Algy 테일러

@harto 난 당신의 의견 후 8 년 답변하지만 어쩌면 다른 사람이 같은 질문을 가질 수 있습니다 => stackoverflow.com/questions/1822350/…
Frosty Z

14

인덱스가 순서에 맞지 않거나 인덱스가 연속적이지 않으면 여기에 나열된 다른 솔루션의 코드가 손상됩니다. 다소 더 나은 솔루션은 다음과 같습니다.

function in_array(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

그리고 보너스로 다음은 PHP의 array_search와 같습니다 (배열에서 요소의 키를 찾는 경우).

function array_search(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return i;
    }
    return false;
}

대체품이 좋습니다. 실제로 PHP에서 노드로 쉽게 포팅했습니다. 감사합니다
Rahim Khoja 2016 년

9

Locutus 라는 프로젝트가 있으며 Javascript로 PHP 함수를 구현하고 in_array () 가 포함되어 있으므로 PHP에서 사용하는 그대로 사용할 수 있습니다.

사용 예 :

in_array('van', myArray);

in_array(1, otherArray, true); // Forcing strict type

4
JQuery의 API에는 inArray 함수도 있습니다. api.jquery.com/jQuery.inArray를
ahPo

@ahPo, 니스! 그러나 Locutus 구현은 의존성이없는 순수한 자바 스크립트라는 장점이 있습니다. 그러므로 귀하의 필요에 가장 적합한 것을 선택하십시오
Marcio Mazzucato

1
또는 Locutus 에서 필요한 기능 을 가져올 수 있습니다 .
Niket Pathak


5
var a = [1,2,3,4,5,6,7,8,9];

var isSixInArray = a.filter(function(item){return item==6}).length ? true : false;

var isSixInArray = a.indexOf(6)>=0;

5

jQuery 솔루션을 사용할 수 있습니다. 여기에서 ducumentation을 확인하십시오. http://api.jquery.com/jquery.inarray/

$.inArray( 10, [ 8, 9, 10, 11 ] );

3
if ($. inArray (10, [8, 9, 10, 11])> -1)과 같이 확인하는 것을 잊지 마십시오 : if ($. inArray (10, [8, 9, 10, 11])) 그리고 항상 true를 반환합니다.
temirbek

추신 : 이것은 유형에 민감하므로 숫자를 확인하면 데이터 유형이 일치하는지 확인하십시오! 즉 : $ .inArray ( '10', [8, 9, 10, 11]); 반환 -1
올리버 M GRECH


3

단일 값이 배열에 있는지 확인하려는 경우 Paolo의 코드가 작업을 수행합니다. 두 배열에 공통적 인 값을 확인하려면 Paolo의 inArray 함수를 사용하여 다음과 같은 것을 원할 것입니다.

function arrayIntersect(a, b) {
    var intersection = [];

    for(var i = 0; i < a.length; i++) {
        if(inArray(b, a[i]))
            intersection.push(a[i]);
    }

    return intersection;
}

이것은 양쪽에있는 값의 배열 반환 줘야 ab. (수학적으로 이것은 두 배열 의 교차점 입니다.)

편집 : 문제에 대한 해결책 은 Paolo의 편집 코드 를 참조하십시오 . :)


이것은 좋지만 실제로 OP가 요구 한 것은 아닙니다. PHP in_array의 기능을 복제하지 않습니다.
Paolo Bergantino

3

사용 가능한 모든 PHP 매개 변수 가 필요한 경우 다음을 사용하십시오.

function in_array(needle, haystack, argStrict) {
    var key = '', strict = !!argStrict;
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;
            }
        }
    }
    else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true;
            }
        }
    }
    return false;
}

3

이 코드를 프로젝트에 추가하고 객체 스타일 inArray 메소드를 사용하십시오.

if (!Array.prototype.inArray) {
    Array.prototype.inArray = function(element) {
        return this.indexOf(element) > -1;
    };
} 
//How it work
var array = ["one", "two", "three"];
//Return true
array.inArray("one");


2
haystack.find(value => value == needle)

여기서 haystack은 배열이고 needle은 배열의 요소입니다. 요소를 찾지 못하면 정의되지 않은 다른 요소가 반환됩니다.


1
function in_array(what, where) {
    var a=false;
    for (var i=0; i<where.length; i++) {
        if(what == where[i]) {
            a=true;
            break;
        }
    }
    return a;
}

1

나는 좋은 jQuery를 솔루션을 발견 여기에 SO에.

var success = $.grep(array_a, function(v,i) {
    return $.inArray(v, array_b) !== -1;
}).length === array_a.length;

누군가 밑줄로 이것을 수행하는 방법의 예를 게시하기를 바랍니다.


1
function in_array(needle, haystack){

    return haystack.indexOf(needle) !== -1;
}

배열의 첫 번째 요소인지 여부 만 반환합니다. indexOf(needle) > 0그것이 거짓을 반환 한다면
DiMono

0

in_arraywith와 동등한 underscore것은 _.indexOf입니다.

예 :

_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found


0

수업에서 사용할 예정이고 기능적으로 작동하고 모든 브라우저에서 작동하는 것을 선호하는 경우 :

inArray: function(needle, haystack)
{
    var result = false;

    for (var i in haystack) {
        if (haystack[i] === needle) {
            result = true;
            break;
        }
    }

    return result;
}

그것이 누군가를 돕기를 바랍니다 :-)

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