web-dev-qa-db-fra.com

Comment vérifier s'il existe plusieurs valeurs dans un tableau Javascript

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:

  1. Extension de Jquery avec une méthode personnalisée 'compare' pour comparer les deux tableaux. Le problème est que cela ne retourne que true lorsque les tableaux sont identiques et comme vous pouvez le voir dans l'exemple 1, je veux qu'il renvoie true même s'ils ne sont pas identiques mais contiennent au moins la valeur
  2. using Jquerys .inArray function , mais cela ne vérifie qu'une valeur dans un tableau, pas plusieurs.

Toute lumière que n'importe qui pourrait jeter sur ce serait génial.

30
Betjamin
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
47
ggreiner

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.


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))
57
user1106925

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.

14
datacarl

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); });
10
pulse0ne

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;
}
0
caleb

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.

0
Daryl Cluzel

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 
}
0
ShankarSangoli