Existe-t-il un moyen en JavaScript de comparer les valeurs d'un tableau et de voir si elles se trouvent dans un autre tableau ?
Similaire à la méthode PHP in_array
fonction ?
Existe-t-il un moyen en JavaScript de comparer les valeurs d'un tableau et de voir si elles se trouvent dans un autre tableau ?
Similaire à la méthode PHP in_array
fonction ?
Non, il n'en a pas. C'est pour cette raison que la plupart des bibliothèques populaires en ont un dans leur paquetage d'utilitaires. Jetez un coup d'œil à la bibliothèque jQuery inArray et celle de Prototype Array.indexOf par exemple.
L'implémentation de jQuery est aussi simple que vous pouvez 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 avez affaire à une quantité raisonnable d'éléments de tableau, la méthode ci-dessus fera l'affaire.
EDITAR : Oups. Je n'avais même pas remarqué que tu voulais voir si un tableau était à l'intérieur d'un autre. D'après la documentation de PHP, c'est le comportement attendu de la fonction 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. Celui d'Alex est la version officielle de l'indexOf de Prototype, et celui de Chris est plus proche de l'indexOf de 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 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 étendu intentionnellement le prototype Array, car c'est généralement une mauvaise idée de le faire.
jQuery.inArray()
fait no retourner un booléen. Il renvoie l'index de l'élément trouvé ou -1 s'il n'a pas été trouvé.
Array.indexOf
a été introduit dans JavaScript 1.6, mais il n'est pas pris en charge par les anciens navigateurs. Heureusement les gars de Mozilla ont fait tout le travail difficile pour vous, et vous a 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 extraits d'utilisation pratiques pour votre plaisir de script.
Il s'agit d'une mise en œuvre plus agréable, plus sûre et plus efficace des liens et du code déjà postés ici ; les spécifications ne prévoient pas la vérification des tableaux dans la botte de foin, et c'est ce que veut l'OP.
D'ailleurs, quel est le but de this.length >>> 0
? S'agit-il d'une conversion vers un type de nombre ?
Array.indexOf
est maintenant normalisé par la cinquième édition d'ECMAScript et doit donc être considéré comme la façon "native" de le faire. Vous aurez encore besoin de renifler et de fournir cette sauvegarde pour les anciens navigateurs pendant longtemps, cependant. @harto : oui, il convertit this.length
en un nombre qui peut être représenté comme un entier non signé de 32 bits. Une valeur native Array
ne peut avoir qu'une longueur déjà conforme, mais la spécification indique que vous pouvez appeler Array.prototype
sur des objets natifs JS qui ne sont pas Array
. Cette vérification, ainsi que d'autres vérifications pédantes, vise à garantir une conformité absolue aux spécifications.
Si les index ne sont pas dans l'ordre, ou si les index ne sont pas consécutifs, le code des autres solutions énumérées ici ne fonctionnera pas. Une solution qui fonctionnerait un peu mieux pourrait être la suivante :
function in_array(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return true;
}
return false;
}
Et, en prime, voici l'équivalent du 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;
}
Il existe un projet appelé Locutus il implémente les fonctions PHP en Javascript et en in_array() est inclus, vous pouvez l'utiliser exactement comme vous le faites en PHP.
Exemples d'utilisation :
in_array('van', myArray);
in_array(1, otherArray, true); // Forcing strict type
Il existe également une fonction inArray dans les API de JQuery. Consultez api.jquery.com/jQuery.inArray
@ahPo, Bien ! Mais l'implémentation de Locutus a l'avantage d'être purement javascript sans aucune dépendance. Donc, choisissez la meilleure solution pour vos besoins
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
4 votes
VOIR D'ABORD CETTE RÉPONSE : stackoverflow.com/questions/784012/ tldr ;
var a = [1, 2, 3]; a.includes(2); // true