2017-08-10 1 views
1

Ich versuche, wenn ein Objekt zu überprüfen, ist bereits in einer Reihe, im Anschluss an diese Antwort hier: How to determine if object is in arrayprüft Objekt bereits in Array funktioniert nicht

ich die Funktion angepasst um meine Bedürfnisse anzupassen, und jetzt sieht es so aus dies:

var _createDatesArray, _objInArray; 

_objInArray = function(array, obj) { 
    var i; 
    i = 0; 
    while (i < array.length) { 
    console.log("array[i] == obj is ", array[i] === obj, " array[i] is ", array[i], " and obj is ", obj); 
    if (array[i] === obj) { 
     return true; 
    } 
    i++; 
    } 
}; 

_createDatesArray = function(val) { 
    var result; 
    if (val != null) { 
    result = { 
     text: val 
    }; 
    if (!_objInArray(scope.datesQuestion.dates, result)) { 
     scope.datesQuestion.dates.push(result); 
    } 
    return console.log(scope.datesQuestion.dates); 
    } 
}; 

Was ich tun muss, ist grundsätzlich festzustellen, ob das Objekt bereits in dem Array ist, und wenn ist, t true zurück.

Wenn das Debuggen, das Ergebnis des Konsolenprotokolls ist die folgende:

array [i] == obj falsche Array ist [i] ist, {Text: "10/08/17"} und obj ist {text: "10/08/17"}

und die Funktion sagt sie verschieden sind (array[i] == obj is false), aber sie sehen gleich zu mir.

Ich habe auch die Art der beiden, die dies:

typeof array[i] is "object" 
typeof obj is "object" 

können Sie mir helfen mit diesem? Warum sind sie anders? was kann anders sein?

_createDatesArray wird aufgerufen, wenn $scope meiner Winkel App seinen Wert ändert auf der Basis eines ng-Modell, aber ich glaube nicht, das

+0

Zwei Objekte sind nur dann gleich, wenn sie das gleiche Objekt sind (unterschiedliche Referenzen). Überprüfen Sie '{a: 'a'} === {a: 'a'}' => falsch. – dfsq

Antwort

3

Sie sind zwei verschiedene Objekte mit dem gleichen Inhalt. Vergleichen sie mit == oder === wird false ergeben.

Da Sie AngularJS verwenden, können Sie stattdessen angular.equals() verwenden, um einen tiefen Vergleich der Objekteigenschaften durchzuführen.

+0

Danke ich wüsste nicht über angular.equals(). Ich werde es betrachten – Nick

+0

Es funktioniert völlig. Vielen Dank – Nick

1

Die Objekte relevant ist Sie vergleichen die gleiche Referenz nicht haben, so == gibt false zurück. Eine genauere Erklärung finden Sie unter Object comparison in JavaScript.

In diesem speziellen Fall könnten Sie einfach den Text von Daten vergleichen, um zu sehen, ob sie gleichwertig sind. Dies würde jedoch nicht für alle Objekte funktionieren, wie der Funktionsname vermuten lässt.

if (arr[i].text === obj.text)

Alternativ könnten Sie eine Methode, die für die Überprüfung erstellen, wenn Ihr Array einen bestimmten Zeitpunkt enthält und vereinfachen sie stark Array.prototype.some mit:

dateInArray = function (array, date) { 
    return array.some(function (arrayDate) { 
    return arrayDate.text === date.text 
    }) 
} 

Oder kurz und bündig ES6 Pfeil Funktionen:

dateInArray = (array, date) => array.some(arrayDate => arrayDate.text === date.text) 
0

array [i] === obj gibt NUR wahr zurück, wenn es das gleiche Objekt ist. In der Verknüpfung, die Sie referenziert haben, ist das Objekt, das geprüft wird, das gleiche Objekt, das in das Array eingefügt wurde. Deshalb gibt es true zurück. In Ihrem Fall erstellen Sie ein neues Objekt 'result' und fügen den Wert dort hinzu. Das Array enthält also nicht genau das gleiche Objekt und gibt daher false zurück. Wenn "Text" die einzige Eigenschaft im Objekt ist, können Sie überprüfen, ob die Eigenschaft 'text' in beiden Objekten gleich ist, anstatt nach dem gesamten Objekt zu suchen.

_objInArray = function(array, obj) { 
    var i; 
    i = 0; 
    while (i < array.length) { 
    if (array[i].text === obj.text) { 
     return true; 
    } 
    i++; 
    } 
}; 
0

Das passiert, weil Objekte in JS durch Referenz verglichen werden, aber nicht durch Werte, die sie haben. Aber Sie müssen Objekte nach ihrem Wert vergleichen. Sie müssen also einige Funktionen von Drittanbietern nutzen oder eigene schreiben. Eine weitere Option ist die Verwendung eines Winkeleinbausystems equalsfunction.

angular.equals($scope.user1, $scope.user2); 

Zum besseren Verständnis kann man einen guten Artikel zu diesem Thema here lesen.

Verwandte Themen