Donc, j'utilise Jquery et j'ai deux tableaux avec des valeurs multiples et je veux vérifier si all les valeurs du premier tableau existent dans le second.
Par exemple, exemple 1 ...
Le tableau A contient les valeurs suivantes
34, 78, 89
Le tableau B contient les valeurs suivantes
78, 67, 34, 99, 56, 89
Cela renverrait true
... exemple 2:
Le tableau A contient les valeurs suivantes
34, 78, 89
Le tableau B contient les valeurs suivantes
78, 67, 99, 56, 89
Cela retournerait false
... exemple 3:
Le tableau A contient les valeurs suivantes
34, 78, 89
Le tableau B contient les valeurs suivantes
78, 89
Cela retournerait false
Jusqu'à présent, j'ai essayé de résoudre ce problème en:
Toute lumière que n'importe qui pourrait jeter sur ce serait génial.
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
Solution JavaScript native
var success = array_a.every(function(val) {
return array_b.indexOf(val) !== -1;
});
Vous aurez besoin de correctifs de compatibilité pour every
et indexOf
si vous utilisez des navigateurs plus anciens, y compris IE8.
.every()
..indexOf()
.Solution jQuery complète
var success = $.grep(array_a, function(v,i) {
return $.inArray(v, array_b) !== -1;
}).length === array_a.length;
Utilise $.grep
avec $.inArray
.
Solution ES2015
La solution native ci-dessus peut être abrégée à l'aide de la syntaxe de la fonction de flèche d'ES2015 et de sa méthode .includes()
:
let success = array_a.every((val) => array_b.includes(val))
J'ai remarqué que la question concerne la résolution de ce problème avec jQuery, mais si quelqu'un d'autre qui ne se limite pas à jQuery se présente, il existe une solution simple utilisant le soulignement js.
En utilisant le trait de soulignement, vous pouvez faire:
_.intersection(ArrayA, ArrayB).length === ArrayA.length;
De la docs:
intersection_.intersection (* tableaux) Calcule la liste des valeurs qui sont l'intersection de tous les tableaux. Chaque valeur du résultat est présente dans chacun des tableaux.
_.intersection ([1, 2, 3], [101, 2, 1, 10], [2, 1]); => [1, 2]
Ainsi, si l’un des éléments de ArrayA était manquant dans ArrayB, l’intersection serait plus courte que ArrayA.
Une ligne pour vérifier que tous les éléments de arr1
existent dans arr2
...
Avec es6:
var containsAll = arr1.every(i => arr2.includes(i));
Sans es6:
var containsAll = arr1.every(function (i) { return arr2.includes(i); });
Vous pouvez utiliser cette fonction simple (variables renommées selon la réponse ci-dessus pour faciliter la lecture):
function contains(haystack, needles) {
return needles.map(function (needle) {
return haystack.indexOf(needle);
}).indexOf(-1) == -1;
}
Si vous avez besoin d'un peu plus de visibilité sur les éléments dans le tableau, vous pouvez utiliser celui-ci:
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();
}
}
Utilisez-le simplement avec var check = tools.arrayContains([10,'foo'], [1,'foo','bar'])
Ensuite, vous obtenez le résultat comme
10 : false
foo : true
Ensuite, si vous ne devez obtenir qu'un seul résultat si l'un d'entre eux est vrai, vous pouvez:
arr = Object.values(check);
(arr.indexOf('true')) ? instru1 : instru2 ;
Je ne pense pas que ce soit la meilleure façon, mais cela fonctionne et est facilement adaptable . Compte tenu de cet exemple, je vous conseille de créer une Object.create(tools)
avant de l'utiliser à votre manière.
Essaye ça.
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
}