Équivalent JavaScript de in_array () de PHP


223

Existe-t-il un moyen en JavaScript de comparer les valeurs d'un tableau et de voir s'il se trouve dans un autre tableau?

Similaire à la in_arrayfonction de PHP ?

Réponses:


258

Non, il n'en a pas. Pour cette raison, la plupart des bibliothèques populaires sont livrées avec une dans leurs packages d'utilitaires. Consultez jQuery InArray et Prototype Array.indexOf des exemples.

L'implémentation de jQuery est aussi simple que vous pourriez vous y attendre:

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

Si vous avez affaire à une quantité raisonnable d'éléments de tableau, ce qui précède fera l'affaire.

EDIT : Oups. Je n'ai même pas remarqué que vous vouliez voir si un tableau était à l'intérieur d'un autre. Selon la documentation PHP, c'est le comportement attendu de 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

Le code publié par Chris et Alex ne suit pas ce comportement. Alex est la version officielle de indexOf de Prototype, et Chris ressemble plus à PHP array_intersect. Cela fait ce que vous voulez:

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

Et voici mon test de ce qui précède:

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

Notez que je n'ai pas intentionnellement étendu le prototype Array car c'est généralement une mauvaise idée de le faire.


1
jQuery.inArray() Est-ce que renvoie pas de booléen. Il renvoie l'index de l'élément trouvé ou -1 s'il n'est pas trouvé
Brad Kent

En raison de la note élevée - vous devez marquer votre réponse comme obsolète
Gerfried

1
il s'agit de la documentation de indexOf w3schools.com/jsref/jsref_indexof_array.asp
yussan

74

Il y a maintenant Array.prototype.includes:

La méthode includes () détermine si un tableau comprend un certain élément, renvoyant vrai ou faux selon le cas.

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

Syntaxe

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

66

Array.indexOfa été introduit dans JavaScript 1.6, mais il n'est pas pris en charge dans les anciens navigateurs. Heureusement, les gars de Mozilla ont fait tout le travail pour vous et vous ont fourni cela pour la compatibilité:

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

Il existe même des extraits d'utilisation pratiques pour votre plaisir de script.


C'est déjà une implémentation plus agréable / plus sûre / meilleure des liens / codes affichés ici; les spécifications n'appellent pas à vérifier les tableaux à l'intérieur de la botte de foin, et c'est ce que l'OP veut.
Paolo Bergantino

3
Soit dit en passant, à quoi sert-il this.length >>> 0? S'agit-il d'une conversion en un type numérique?
harto

3
Array.indexOfest désormais normalisé par ECMAScript Fifth Edition et doit donc être considéré comme la manière «native» appropriée de le faire. Cependant, vous devrez toujours renifler et fournir cette sauvegarde pour un navigateur plus ancien pendant longtemps. @harto: oui, il se convertit this.lengthen un nombre qui peut être représenté comme un entier non signé 32 bits. Un natif Arrayne peut avoir qu'une longueur qui est déjà conforme à cela, mais la spécification stipule que vous pouvez appeler des Array.prototypeméthodes sur des objets natifs JS qui ne le sont pas Array. Ceci et l'autre élément de vérification d'argument pédant est de garantir une conformité absolue aux spécifications.
bobince

3
Il existe une version différente de polyfill disponible directement à partir de Mozilla - developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Algy Taylor

@harto Je réponds 8 ans après votre commentaire mais peut-être que quelqu'un d'autre pourrait avoir la même question => voir stackoverflow.com/questions/1822350/…
Frosty Z

14

Si les index ne sont pas en séquence, ou si les index ne sont pas consécutifs, le code des autres solutions répertoriées ici sera rompu. Une solution qui fonctionnerait un peu mieux pourrait être:

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

Et, en bonus, voici l'équivalent de array_search de PHP (pour trouver la clé de l'élément dans le tableau:

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

Belle goutte en remplacement. Vraiment rendu le portage de php au nœud facile. merci
Rahim Khoja

9

Il y a un projet appelé Locutus , il implémente des fonctions PHP en Javascript et in_array () est inclus, vous pouvez l'utiliser exactement comme vous l'utilisez en PHP.

Exemples d'utilisation:

in_array('van', myArray);

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

4
Il existe également une fonction inArray dans les API de JQuery. Vérifiez api.jquery.com/jQuery.inArray
ahPo

@ahPo, Nice! Mais l'implémentation de Locutus a l'avantage d'être du pur javascript sans dépendances. Alors, choisissez le meilleur pour vos besoins
Marcio Mazzucato

1
ou vous pouvez simplement importer la fonction requise depuis 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

La solution jQuery est disponible, consultez la ducumentation ici: http://api.jquery.com/jquery.inarray/

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

3
n'oubliez pas de vérifier comme ceci: if ($. inArray (10, [8, 9, 10, 11])> -1) parce que j'ai aimé ceci: if ($. inArray (10, [8, 9, 10, 11])) et cela revient toujours vrai
temirbek

PS: Ceci est sensible au type, donc si vous recherchez des chiffres, assurez-vous que vos types de données correspondent! c'est-à-dire: $ .inArray ('10', [8, 9, 10, 11]); retournerait -1
Oliver M Grech


3

Si vous voulez seulement vérifier si une seule valeur est dans un tableau, le code de Paolo fera le travail. Si vous voulez vérifier quelles valeurs sont communes aux deux tableaux, alors vous voudrez quelque chose comme ça (en utilisant la fonction inArray de 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;
}

Cela renverra un tableau de valeurs qui sont à la fois dans aet b. (Mathématiquement, il s'agit d'une intersection des deux tableaux.)

EDIT: Voir Paolo's Edited Code pour la solution à votre problème. :)


Bien que ce soit bien, ce n'est pas vraiment ce que le PO a demandé; il ne reproduit pas la fonctionnalité de in_array de PHP.
Paolo Bergantino

3

Si vous avez besoin de tous les paramètres PHP disponibles, utilisez ceci:

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

Ajoutez ce code à votre projet et utilisez les méthodes inArray de style objet

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)

où meule de foin est un tableau et aiguille est un élément du tableau. Si l'élément non trouvé sera retourné non défini, sinon le même élément.


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

J'ai trouvé une excellente solution jQuery ici sur SO.

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

J'aimerais que quelqu'un poste un exemple de la façon de procéder en soulignant.


1
function in_array(needle, haystack){

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

Cela ne renvoie que s'il s'agit du premier élément du tableau; si indexOf(needle) > 0elle retourne faux
DiMono

0

Un équivalent de in_arraywith underscoreest _.indexOf

Exemples:

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


0

Si vous allez l'utiliser dans une classe, et si vous préférez qu'il soit fonctionnel (et fonctionne dans tous les navigateurs):

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

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

    return result;
}

J'espère que cela aide quelqu'un :-)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.