É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
?
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.
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.
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)
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;
}
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
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;
jQuery est disponible, vérifiez la ducmentation ici: http://api.jquery.com/jquery.inarray /
$.inArray( 10, [ 8, 9, 10, 11 ] );
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. :)
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;
}
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");
avec Dojo Toolkit , vous utiliserez dojo.indexOf()
. Voir dojo.index de pour la documentation, et tableaux rendus faciles par Bryan Forbes pour quelques exemples.
il existe une fonction équivalente:
includes()
Regardez ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
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;
}
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
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 :-)
function in_array(needle, haystack){
return haystack.indexOf(needle) !== -1;
}