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_array
fonction de PHP ?
la source
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_array
fonction de PHP ?
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.
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éindexOf
w3schools.com/jsref/jsref_indexof_array.aspIl y a maintenant
Array.prototype.includes
:la source
Array.indexOf
a é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é:Il existe même des extraits d'utilisation pratiques pour votre plaisir de script.
la source
this.length >>> 0
? S'agit-il d'une conversion en un type numérique?Array.indexOf
est 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 convertitthis.length
en un nombre qui peut être représenté comme un entier non signé 32 bits. Un natifArray
ne peut avoir qu'une longueur qui est déjà conforme à cela, mais la spécification stipule que vous pouvez appeler desArray.prototype
méthodes sur des objets natifs JS qui ne le sont pasArray
. Ceci et l'autre élément de vérification d'argument pédant est de garantir une conformité absolue aux spécifications.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:
Et, en bonus, voici l'équivalent de array_search de PHP (pour trouver la clé de l'élément dans le tableau:
la source
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:
la source
Vous pouvez simplement utiliser la fonction "comprend" comme expliqué dans cette leçon sur w3schools
On dirait
la source
la source
La solution jQuery est disponible, consultez la ducumentation ici: http://api.jquery.com/jquery.inarray/
la source
Il existe une fonction équivalente:
Regardez ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
la source
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):
Cela renverra un tableau de valeurs qui sont à la fois dans
a
etb
. (Mathématiquement, il s'agit d'une intersection des deux tableaux.)EDIT: Voir Paolo's Edited Code pour la solution à votre problème. :)
la source
Si vous avez besoin de tous les paramètres PHP disponibles, utilisez ceci:
la source
Ajoutez ce code à votre projet et utilisez les méthodes inArray de style objet
la source
Avec Dojo Toolkit , vous utiliseriez
dojo.indexOf()
. Voir dojo.indexOf pour la documentation et Arrays Made Easy de Bryan Forbes pour quelques exemples.la source
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.
la source
la source
J'ai trouvé une excellente solution jQuery ici sur SO.
J'aimerais que quelqu'un poste un exemple de la façon de procéder en soulignant.
la source
la source
indexOf(needle) > 0
elle retourne fauxUn équivalent de
in_array
withunderscore
est _.indexOfExemples:
_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found
la source
Si vous allez l'utiliser dans une classe, et si vous préférez qu'il soit fonctionnel (et fonctionne dans tous les navigateurs):
J'espère que cela aide quelqu'un :-)
la source