JavaScript-Äquivalent zu PHPs in_array ()


223

Gibt es in JavaScript eine Möglichkeit, Werte aus einem Array zu vergleichen und festzustellen, ob sie sich in einem anderen Array befinden?

Ähnlich wie bei PHP in_array?

Antworten:


258

Nein, es hat keinen. Aus diesem Grund enthalten die meisten gängigen Bibliotheken eine in ihren Dienstprogrammpaketen. Schauen Sie sich jQuery InArray und Prototype Array.indexOf für Beispiele.

Die Implementierung von jQuery ist so einfach, wie Sie es vielleicht erwarten:

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

Wenn Sie mit einer vernünftigen Anzahl von Array-Elementen zu tun haben, reicht das oben Genannte aus.

EDIT : Whoops. Ich habe nicht einmal bemerkt, dass Sie sehen wollten, ob sich ein Array in einem anderen befindet. Laut der PHP-Dokumentation ist dies das erwartete Verhalten von PHPs 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

Der von Chris und Alex gepostete Code folgt diesem Verhalten nicht. Alex's ist die offizielle Version von Prototypes indexOf und Chris's ähnelt eher PHPs array_intersect. Das macht was du willst:

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

Und das ist mein Test von oben drauf:

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

Beachten Sie, dass ich den Array-Prototyp absichtlich nicht erweitert habe, da dies im Allgemeinen eine schlechte Idee ist.


1
jQuery.inArray()gibt keinen Booleschen Wert zurück. Es gibt den Index des gefundenen Elements zurück oder -1, wenn es nicht gefunden wird
Brad Kent

Aufgrund der hohen Bewertung - Sie sollten Ihre Antwort als veraltet markieren
Gerfried

1
Dies ist die Dokumentation von indexOf w3schools.com/jsref/jsref_indexof_array.asp
Yussan

74

Es gibt jetzt Array.prototype.includes:

Die Methode include () bestimmt, ob ein Array ein bestimmtes Element enthält, und gibt je nach Bedarf true oder false zurück.

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

Syntax

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

66

Array.indexOfwurde in JavaScript 1.6 eingeführt, wird jedoch in älteren Browsern nicht unterstützt. Zum Glück haben die Jungs bei Mozilla die ganze harte Arbeit für Sie geleistet und Ihnen dies aus Kompatibilitätsgründen zur Verfügung gestellt:

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

Es gibt sogar einige praktische Verwendungsausschnitte für Ihr Skriptvergnügen.


Dies ist eine schönere / sicherere / bessere Implementierung der hier bereits veröffentlichten Links / Codes. Die Spezifikationen fordern keine Überprüfung auf Arrays im Heuhaufen, und genau das will das OP.
Paolo Bergantino

3
Was ist übrigens der Zweck von this.length >>> 0? Ist das eine Konvertierung in einen Zahlentyp?
Harto

3
Array.indexOfist jetzt durch ECMAScript Fifth Edition standardisiert und sollte daher als die richtige "native" Methode angesehen werden. Sie müssen dieses Backup jedoch noch lange schnüffeln und für ältere Browser bereitstellen. @harto: Ja, es wird this.lengthin eine Zahl konvertiert , die als 32-Bit-Ganzzahl ohne Vorzeichen dargestellt werden kann. Ein Native Arraykann nur eine Länge haben, die dieser bereits entspricht. Die Spezifikation besagt jedoch, dass Sie Array.prototypeMethoden für Native-JS-Objekte aufrufen können, die dies nicht sind Array. Dieses und das andere pedantische Argument, das die Dinge überprüft, soll die absolute Einhaltung der Spezifikationen gewährleisten.
Bobince

3
Es gibt eine andere Polyfill-Version direkt von Mozilla erhältlich - developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Algy Taylor

@harto Ich antworte 8 Jahre nach Ihrem Kommentar, aber vielleicht könnte jemand anderes die gleiche Frage haben => siehe stackoverflow.com/questions/1822350/…
Frosty Z

14

Wenn die Indizes nicht aufeinanderfolgend sind oder wenn die Indizes nicht aufeinanderfolgend sind, wird der Code in den anderen hier aufgeführten Lösungen unterbrochen. Eine Lösung, die etwas besser funktionieren würde, könnte sein:

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

Und als Bonus ist hier das Äquivalent zu PHPs array_search (um den Schlüssel des Elements im Array zu finden:

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

Schöner Ersatz. Wirklich einfach Portierung von PHP auf Node. danke
Rahim Khoja

9

Es gibt ein Projekt namens Locutus , es implementiert PHP-Funktionen in Javascript und in_array () ist enthalten. Sie können es genau so verwenden, wie Sie es in PHP verwenden.

Anwendungsbeispiele:

in_array('van', myArray);

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

4
Es gibt auch eine inArray-Funktion in den APIs von JQuery. Überprüfen Sie api.jquery.com/jQuery.inArray
ahPo

@ahPo, schön! Die Locutus-Implementierung hat jedoch den Vorteil, dass es sich um reines Javascript ohne Abhängigkeiten handelt. Also, wählen Sie die beste für Ihre Bedürfnisse
Marcio Mazzucato

1
oder Sie können einfach die gewünschte Funktion aus Locutus importieren.
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

Die jQuery-Lösung ist verfügbar. Überprüfen Sie die Dokumentation hier: http://api.jquery.com/jquery.inarray/

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

3
Vergiss nicht, so zu prüfen: if ($. inArray (10, [8, 9, 10, 11])> -1), weil mir das gefallen hat: if ($. inArray (10, [8, 9, 10, 11])) und es gibt immer true zurück
temirbek

PS: Dies ist typabhängig. Wenn Sie also nach Zahlen suchen, stellen Sie sicher, dass Ihre Datentypen übereinstimmen! dh: $ .inArray ('10', [8, 9, 10, 11]); würde -1 zurückgeben
Oliver M Grech


3

Wenn Sie nur überprüfen möchten, ob sich ein einzelner Wert in einem Array befindet, erledigt der Code von Paolo die Aufgabe. Wenn Sie überprüfen möchten, welche Werte beiden Arrays gemeinsam sind, möchten Sie Folgendes (mithilfe der inArray-Funktion von Paolo):

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

Dies gibt ein Array von Werten zurück, die sowohl in aals auch in enthalten sind b. (Mathematisch gesehen ist dies ein Schnittpunkt der beiden Arrays.)

EDIT: Siehe Paolos Edited - Code für die Lösung für Ihr Problem. :) :)


Obwohl dies schön ist, ist es nicht wirklich das, was das OP verlangt hat; Es repliziert nicht die Funktionalität von PHPs in_array.
Paolo Bergantino

3

Wenn Sie alle verfügbaren PHP- Parameter benötigen , verwenden Sie diese:

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

Fügen Sie diesen Code Ihrem Projekt hinzu und verwenden Sie die inArray-Methoden im Objektstil

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)

Dabei ist Heuhaufen ein Array und Nadel ein Element im Array. Wenn das nicht gefundene Element undefiniert zurückgegeben wird, wird dasselbe Element zurückgegeben.


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

Ich habe hier auf SO eine großartige jQuery-Lösung gefunden .

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

Ich wünschte, jemand würde ein Beispiel dafür in Unterstrich posten.


1
function in_array(needle, haystack){

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

Dies gibt nur zurück, ob es das erste Element im Array ist. wenn indexOf(needle) > 0es falsch zurückgeben wird
DiMono

0

Ein Äquivalent von in_arraywith underscoreist _.indexOf

Beispiele:

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


0

Wenn Sie es in einer Klasse verwenden möchten und wenn Sie es vorziehen, dass es funktionsfähig ist (und in allen Browsern funktioniert):

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

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

    return result;
}

Hoffe es hilft jemandem :-)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.