web-dev-qa-db-fra.com

Équivalent JavaScript de in_array () de PHP

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 fonction _ (_in_array )?

196
roflwaffle

Non, il n'en a pas. Pour cette raison, les bibliothèques les plus populaires en contiennent un dans leurs packages d’utilitaires. Consultez jQuery inArray et le prototype Array.indexOf pour obtenir des exemples.

l'implémentation de jQuery est aussi simple que vous pourriez l'imaginer:

_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 traitez avec une quantité raisonnable d’éléments de tableau, ce qui précède fera très bien 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. D'après la documentation PHP, il s'agit du comportement attendu de 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's est la version officielle de l'index de Prototype, et Chris ressemble plus à PHP array_intersect . Cela fait ce que tu veux:

_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 ceci mon test de ce qui précède sur elle:

_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.

243
Paolo Bergantino

Array.indexOf a été introduit dans JavaScript 1.6, mais il n'est pas pris en charge par les navigateurs plus anciens. Heureusement, les responsables de Mozilla ont fait tout le travail acharné pour vous, et vous ont fourni ceci par souci de 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.

65
Alex Barrett

Il y a maintenant Array.prototype.includes :

La méthode includes () détermine si un tableau inclut un élément donné et renvoie la valeur true ou false selon le cas.

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

Syntaxe

_arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
_
44
alemjerus

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 (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;
}
14
cale_b

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

Exemples d'utilisation:

in_array('van', myArray);

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

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

$.inArray( 10, [ 8, 9, 10, 11 ] );
5
Webars
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;
4
Rax Wunter

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");
3

Si vous voulez seulement vérifier si une seule valeur est dans un tableau, alors 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 ceci (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;
}

Ceci retournera un tableau de valeurs qui sont à la fois dans a et b. (Mathématiquement, il s'agit d'un intersection des deux tableaux.)

MODIFIER: Voir Code édité par Paolo pour la solution à votre problème. :)

3
Chris Doble

Si vous avez besoin de tous les PHP paramètres 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
Andres SK

Avec Dojo Toolkit , vous utiliseriez dojo.indexOf(). Voir dojo.indexOf pour la documentation, et Les tableaux simplifiés par Bryan Forbes pour quelques exemples.

2
voidstate

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;

Je souhaite que quelqu'un poste un exemple de la façon de faire cela en soulignement.

1
pymarco
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
Priya

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 ça aide quelqu'un :-)

0
MageParts
function in_array(needle, haystack){

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

Un équivalent de in_array avec underscore est _. IndexOf

Exemples:

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

0
Bogdan D