validacion - Cómo verificar si existen múltiples valores dentro de una matriz de Javascript
validar formulario javascript html5 (7)
Entonces, estoy usando Jquery y tengo dos matrices con varios valores y quiero verificar si todos los valores de la primera matriz existen en la segunda.
Por ejemplo, ejemplo 1 ...
La matriz A contiene los siguientes valores
34, 78, 89
La matriz B contiene los siguientes valores
78, 67, 34, 99, 56, 89
Esto volvería verdad
... ejemplo 2:
La matriz A contiene los siguientes valores
34, 78, 89
La matriz B contiene los siguientes valores
78, 67, 99, 56, 89
Esto devolvería falso
... ejemplo 3:
La matriz A contiene los siguientes valores
34, 78, 89
La matriz B contiene los siguientes valores
78, 89
Esto devolvería falso
Hasta ahora he tratado de resolver esto por:
- Extender Jquery con un método personalizado de "comparación" para comparar los dos arreglos. El problema es que solo devuelve true cuando las matrices son idénticas y, como puede ver en el ejemplo 1, quiero que devuelva true incluso si no son idénticas pero al menos contienen el valor
- utilizando la función .inArray de Jquerys , pero esto solo comprueba un valor en una matriz, no múltiple.
Cualquier luz que cualquiera pudiera arrojar sobre esto sería genial.
Noté que la pregunta es acerca de resolver esto con jQuery, pero si alguien más que no está limitado a jQuery aparece, entonces hay una solución simple usando el guión bajo js.
Usando el guión bajo js puedes hacer:
_.intersection(ArrayA, ArrayB).length === ArrayA.length;
De la documentación:
intersection_.intersection (* arrays) Calcula la lista de valores que son la intersección de todos los arrays. Cada valor en el resultado está presente en cada una de las matrices.
_.intersección ([1, 2, 3], [101, 2, 1, 10], [2, 1]); => [1, 2]
Ergo, si uno de los elementos en ArrayA faltaba en ArrayB, entonces la intersección sería más corta que ArrayA.
Prueba esto.
var arr1 = [34, 78, 89];
var arr2 = [78, 67, 34, 99, 56, 89];
var containsVal = true;
$.each(arr1, function(i, val){
if(!$.inArray(val, arr2) != -1){
retVal = false;
return false;
}
});
if(containsVal){
//arr2 contains all the values from arr1
}
Puede usar esta función simple (variables renombradas según la respuesta anterior para una fácil lectura):
function contains(haystack, needles) {
return needles.map(function (needle) {
return haystack.indexOf(needle);
}).indexOf(-1) == -1;
}
Si necesita un poco más de visibilidad sobre qué elementos están en la matriz, puede utilizar este:
var tools = {
elem : {},
arrayContains : function(needles, arrhaystack) {
if (this.typeOf(needles) === ''array'') {
needle.reduce(function(result,item,$i,array){ // You can use any other way right there.
var present = (arrhaystack.indexOf(item) > -1);
Object.defineProperty(tools.elem, item, {
value : present,
writable : true
});
},{})
return this.elem;
}
},
typeOf : function(obj) {
return {}.toString.call(obj).split('' '')[1].slice(0, -1).toLowerCase();
}
}
Úselo con simplemente var check = tools.arrayContains([10,''foo''], [1,''foo'',''bar''])
Entonces obtienes el resultado como
10 : false
foo : true
Entonces, si solo necesita obtener un resultado, si uno de ellos es verdadero, puede:
arr = Object.values(check);
(arr.indexOf(''true'')) ? instru1 : instru2 ;
No creo que sea la mejor manera, pero funciona y es fácilmente adaptable. Teniendo en cuenta este ejemplo, te aconsejo que hagas un Object.create(tools)
antes de usarlo a tu manera.
Una sola línea para probar que todos los elementos en arr1
existen en arr2
...
Con es6:
var containsAll = arr1.every(i => arr2.includes(i));
Sin es6:
var containsAll = arr1.every(function (i) { return arr2.includes(i); });
Solución nativa de JavaScript
var success = array_a.every(function(val) {
return array_b.indexOf(val) !== -1;
});
Necesitará parches de compatibilidad para every
e indexOf
si está admitiendo navegadores más antiguos, incluido IE8.
- Parche de compatibilidad de MDN para
.every()
. - Parche de compatibilidad de MDN para
.indexOf()
.
Solución jQuery completa
var success = $.grep(array_a, function(v,i) {
return $.inArray(v, array_b) !== -1;
}).length === array_a.length;
Utiliza $.grep
con $.inArray
.
Solución ES2015
La solución nativa anterior se puede acortar utilizando la sintaxis de la función de flecha de ES2015 y su método .includes()
:
let success = array_a.every((val) => array_b.includes(val))
function containsAll(needles, haystack){
for(var i = 0 , len = needles.length; i < len; i++){
if($.inArray(needles[i], haystack) == -1) return false;
}
return true;
}
containsAll([34, 78, 89], [78, 67, 34, 99, 56, 89]); // true
containsAll([34, 78, 89], [78, 67, 99, 56, 89]); // false
containsAll([34, 78, 89], [78, 89]); // false