Équivalent JavaScript des PHP dans le tableau()

y a-t-il un moyen en JavaScript de comparer les valeurs d'un tableau et de voir si c'est dans un autre tableau?

similaire à la fonction PHP in_array ?

185
demandé sur Peter Mortensen 2009-04-24 03:45:57

17 réponses

Non, il n'y en a pas. Pour cette raison, la plupart des bibliothèques populaires viennent avec un utilitaire de paquets. Consultez le tableau inArray 1519100920 "de jQuery et le tableau de Prototype.index de pour exemples.

la mise en œuvre de jQuery est aussi simple que vous pouvez 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é saine d'éléments de tableau ci-dessus va faire le tour bien.

MODIFIER : 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 de PHP, C'est le comportement attendu des 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 posté par Chris et Alex ne suit pas ce comportement. Alex est la version officielle de L'indexOf de Prototype, et Chris est plus comme 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 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 intentionnellement pas étendu le prototype du tableau car c'est généralement une mauvaise idée de le faire.

233
répondu Paolo Bergantino 2015-07-01 18:44:22

Array.indexOf a été introduit dans JavaScript 1.6, mais il n'est pas pris en charge dans les navigateurs plus anciens. Heureusement les hommes de Mozilla ont fait tout le travail pour vous, et vous ont fourni ceci 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 y a même quelques bribes d'utilisation pratiques pour votre plaisir de script.

63
répondu Alex Barrett 2011-03-23 16:59:09

il y a maintenant Array.prototype.includes :

la méthode includes() détermine si un tableau inclut un certain élément, qui renvoie 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)
25
répondu alemjerus 2018-04-16 16:51:27

si les index ne sont pas dans l'ordre, ou si les index ne sont pas consécutifs, le code dans les autres solutions énumérées ici se cassera. 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 prime, 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;
}
13
répondu cale_b 2011-08-06 16:59:20

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 utilisez en PHP.

exemples d'utilisation:

in_array('van', myArray);

in_array(1, otherArray, true); // Forcing strict type
9
répondu Marcio Mazzucato 2017-07-08 22:34:38
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
répondu Rax Wunter 2013-05-27 07:00:10
La solution

jQuery est disponible, vérifiez la ducmentation ici: http://api.jquery.com/jquery.inarray /

$.inArray( 10, [ 8, 9, 10, 11 ] );
4
répondu Webars 2014-12-25 21:12:22

Si vous voulez seulement vérifier si une seule valeur est dans un tableau, puis Paolo du code du travail. Si vous voulez vérifier quelles valeurs sont communes aux deux tableaux, alors vous voulez 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 renvoie un tableau de valeurs qui sont à la fois a et b . (Mathématiquement, c'est une intersection des deux tableaux.)

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

3
répondu Chris Doble 2017-05-23 12:02:47

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
répondu Andres SK 2013-04-08 14:46:44

ajouter ce code à votre projet et utiliser les méthodes inarray objet-style

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
répondu Никита Овчинников 2016-03-24 16:12:48

avec Dojo Toolkit , vous utiliserez dojo.indexOf() . Voir dojo.index de pour la documentation, et tableaux rendus faciles par Bryan Forbes pour quelques exemples.

2
répondu voidstate 2013-04-08 14:43:33
2
répondu Jacek Dziurdzikowski 2018-01-16 09:09:37
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
répondu Priya 2013-04-08 14:44:48

j'ai trouvé une grande 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 affiche un exemple de la façon de faire ceci dans underscore.

1
répondu pymarco 2017-05-23 12:18:26

un équivalent de in_array avec underscore est _.index de

exemples:

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

0
répondu Bogdan D 2015-01-13 16:56:44

Si vous allez l'utiliser dans une classe, et si vous préférez qu'il soit fonctionnel (et de travailler 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;
}

Espère que cela aide quelqu'un :-)

0
répondu MageParts 2015-01-13 22:30:55
function in_array(needle, haystack){

    return haystack.indexOf(needle) !== -1;
}
-1
répondu crisswalt 2016-08-13 14:35:00