it-swarm.com.de

So prüfen Sie, ob in einem Javascript-Array mehrere Werte vorhanden sind

Ich verwende also Jquery und habe zwei Arrays mit mehreren Werten. Ich möchte prüfen, ob all die Werte im ersten Array im zweiten Array enthält.

Zum Beispiel Beispiel 1 ...

Array A enthält die folgenden Werte

34, 78, 89

Array B enthält die folgenden Werte

78, 67, 34, 99, 56, 89

Dies würde true zurückgeben.

... Beispiel 2:

Array A enthält die folgenden Werte

34, 78, 89

Array B enthält die folgenden Werte

78, 67, 99, 56, 89

Dies würde false zurückgeben.

... Beispiel 3:

Array A enthält die folgenden Werte

34, 78, 89

Array B enthält die folgenden Werte

78, 89

Dies würde false zurückgeben.

Bisher habe ich versucht, dies zu lösen durch:

  1. Erweitern von Jquery mit einer benutzerdefinierten Vergleichsmethode , um die beiden Arrays zu vergleichen. Das Problem ist, dass dies nur true zurückgibt, wenn die Arrays identisch sind. Wie Sie in Beispiel 1 sehen können, möchte ich, dass es true zurückgibt, auch wenn sie nicht identisch sind, aber mindestens den Wert enthalten
  2. mit Jquerys .inArray function , dies prüft jedoch nur nach einem Wert in einem Array, nicht nach mehreren.

Jedes Licht, das irgendjemand dazu werfen könnte, wäre großartig.

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

Native JavaScript-Lösung

var success = array_a.every(function(val) {
    return array_b.indexOf(val) !== -1;
});

Sie benötigen Kompatibilitätspatches für every und indexOf, wenn Sie ältere Browser einschließlich IE8 unterstützen.


Vollständige jQuery-Lösung

var success = $.grep(array_a, function(v,i) {
    return $.inArray(v, array_b) !== -1;
}).length === array_a.length;

Verwendet $.grep mit $.inArray .


ES2015-Lösung

Die oben genannte native Lösung kann mit der Pfeilfunktionssyntax von ES2015 und ihrer .includes()-Methode gekürzt werden:

let success = array_a.every((val) => array_b.includes(val))
57
user1106925

Ich habe bemerkt, dass es sich bei der Frage um die Lösung dieses Problems mit jQuery handelt. Wenn jedoch jemand, der nicht auf jQuery beschränkt ist, vorbeikommt, gibt es eine einfache Lösung, die Unterstriche js verwendet.

Unterstriche js können Sie machen:

_.intersection(ArrayA, ArrayB).length === ArrayA.length;

Aus den Dokumenten:

intersection_.intersection (* Arrays) Berechnet die Liste der Werte, die den Schnittpunkt aller Arrays bilden. Jeder Wert im Ergebnis ist in jedem der Arrays vorhanden.

Schnitt ([1, 2, 3], [101, 2, 1, 10], [2, 1]);. => [1, 2]

Wenn also eines der Elemente in ArrayA in ArrayB fehlt, wäre die Schnittmenge kürzer als ArrayA.

14
datacarl

Ein Einzeiler zum Testen, dass alle Elemente in arr1 in arr2... vorhanden sind.

Mit es6:

var containsAll = arr1.every(i => arr2.includes(i));

Ohne es6:

var containsAll = arr1.every(function (i) { return arr2.includes(i); });
10
pulse0ne

Sie können diese einfache Funktion verwenden (umbenannte Variablen zur besseren Lesbarkeit gemäß der obigen Antwort):

function contains(haystack, needles) {

    return needles.map(function (needle) { 
        return haystack.indexOf(needle);
    }).indexOf(-1) == -1;
}
0
caleb

Wenn Sie etwas mehr Sicht auf die Elemente im Array benötigen, können Sie diese verwenden: 

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();
        }
    }

Verwenden Sie es einfach mit var check = tools.arrayContains([10,'foo'], [1,'foo','bar'])

Dann bekommst du das Ergebnis gerne 

10 : false
foo : true

Wenn Sie nur ein Ergebnis benötigen, wenn eines davon zutrifft, können Sie: 

arr = Object.values(check);
(arr.indexOf('true')) ? instru1 : instru2 ;

Ich denke nicht, dass dies der bessere Weg ist, aber es funktioniert und ist leicht anpassungsfähig. In Anbetracht dieses Beispiels empfehle ich Ihnen, eine Object.create(tools) zu erstellen, bevor Sie es auf Ihre Art und Weise verwenden.

0
Daryl Cluzel

Versuche dies.

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