¿Hay alguna manera en JavaScript de comparar valores de una matriz y ver si está en otra matriz?
¿Similar a la in_array
función de PHP ?
fuente
¿Hay alguna manera en JavaScript de comparar valores de una matriz y ver si está en otra matriz?
¿Similar a la in_array
función de PHP ?
No, no tiene uno. Por esta razón, las bibliotecas más populares vienen con una en sus paquetes de utilidad. Consulte jQuery's inArray y Prototype's Array.indexOf para ver ejemplos.
La implementación de jQuery es tan simple como podría esperarse:
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
Si se trata de una cantidad sensata de elementos de matriz, lo anterior funcionará muy bien.
EDITAR : Whoops. Ni siquiera me di cuenta de que querías ver si una matriz estaba dentro de otra. De acuerdo con la documentación de PHP, este es el comportamiento esperado 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
El código publicado por Chris y Alex no sigue este comportamiento. Alex es la versión oficial del prototipo indexOf, y Chris es más como PHP array_intersect
. Esto hace lo que quieres:
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;
}
Y esta es mi prueba de lo anterior:
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
Tenga en cuenta que intencionalmente no extendí el prototipo de matriz, ya que generalmente es una mala idea hacerlo.
jQuery.inArray()
no no volver booleano. Devuelve el índice del elemento encontrado o -1 si no se encuentraindexOf
w3schools.com/jsref/jsref_indexof_array.aspAhora hay
Array.prototype.includes
:fuente
Array.indexOf
se introdujo en JavaScript 1.6, pero no es compatible con navegadores antiguos. Afortunadamente, los muchachos de Mozilla han hecho todo el trabajo duro por ti y te han proporcionado esto por compatibilidad:Incluso hay algunos fragmentos de uso útiles para su placer de secuencias de comandos.
fuente
this.length >>> 0
? ¿Es eso una conversión a un tipo de número?Array.indexOf
ahora está estandarizado por la quinta edición de ECMAScript, por lo que debe considerarse la forma "nativa" adecuada de hacerlo. Sin embargo, aún necesitará olfatear y proporcionar esta copia de seguridad para navegadores antiguos durante mucho tiempo. @harto: sí, se conviertethis.length
en un Número que se puede representar como un entero sin signo de 32 bits. Un nativoArray
solo puede tener una longitud que ya cumpla con esto, pero la especificación establece que puede llamar aArray.prototype
métodos en objetos JS nativos que no lo sonArray
. Este y el otro argumento pedante de comprobación de cosas es para garantizar el cumplimiento absoluto de las especificaciones.Si los índices no están en secuencia, o si los índices no son consecutivos, el código en las otras soluciones enumeradas aquí se romperá. Una solución que funcionaría algo mejor podría ser:
Y, como beneficio adicional, aquí está el equivalente a array_search de PHP (para encontrar la clave del elemento en la matriz:
fuente
Hay un proyecto llamado Locutus , implementa funciones PHP en Javascript y se incluye in_array () , puede usarlo exactamente como lo hace en PHP.
Ejemplos de uso:
fuente
Simplemente puede usar la función "incluye" como se explica en esta lección en w3schools
parece que
fuente
fuente
La solución jQuery está disponible, consulte la documentación aquí: http://api.jquery.com/jquery.inarray/
fuente
Hay una función equivalente:
Mire aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
fuente
Si solo desea verificar si un solo valor está en una matriz, entonces el código de Paolo hará el trabajo. Si desea verificar qué valores son comunes a ambas matrices, entonces querrá algo como esto (usando la función inArray de Paolo):
Esto devolverá una matriz de valores que están en ambos
a
yb
. (Matemáticamente, esta es una intersección de las dos matrices).EDITAR: Vea el Código Editado de Paolo para la solución a su problema. :)
fuente
Si necesita todos los parámetros PHP disponibles, use esto:
fuente
Agregue este código a su proyecto y use el estilo de objeto en los métodos de matriz
fuente
Con Dojo Toolkit , lo usarías
dojo.indexOf()
. Ver dojo.indexOf para la documentación, y Arrays Made Easy de Bryan Forbes para algunos ejemplos.fuente
donde haystack es una matriz y aguja es un elemento en la matriz. Si el elemento no encontrado se devolverá indefinido, de lo contrario, el mismo elemento.
fuente
fuente
Encontré una gran solución jQuery aquí en SO.
Desearía que alguien publicara un ejemplo de cómo hacer esto en subrayado.
fuente
fuente
indexOf(needle) > 0
volverá falsoUn equivalente de
in_array
withunderscore
es _.indexOfEjemplos:
_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found
fuente
Si lo va a usar en una clase, y si prefiere que sea funcional (y que funcione en todos los navegadores):
Espero que ayude a alguien :-)
fuente