2017-08-10 41 views
1

我想檢查的對象是已在數組中,下面這個答案在這裏:How to determine if object is in array檢查,如果對象是已經在陣列不工作

我調整,以適合我的需要的功能,現在它看起來像這個:

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

我需要做的,基本上是看對象是否已經在數組中,如果是,t返回true。

當調試,控制檯日誌的結果如下:

陣列[I] == obj是假陣列[i]是{文字: 「17年10月8日」}和OBJ是 {文字:「17年10月8日」}

和功能說,他們是不同的(array[i] == obj is false),但他們看起來是一樣的我。

我還檢查了雙方的類型,這是這樣的:

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

你能幫助我嗎?他們爲什麼不同?有什麼不同?

_createDatesArray被稱爲當我的角度應用的$scope根據NG-模型改變它的價值,但我不認爲這是相關

+0

只有兩個對象是相同的對象(不同的引用)時,兩個對象才相等。檢查'{a:'a'} === {a:'a'}'=> false。 – dfsq

回答

3

它們是具有相同內容的兩個不同的對象。將它們與=====進行比較將產生錯誤。

由於您使用的是AngularJS,因此您可以使用angular.equals()來執行該對象屬性的深層比較。

+0

謝謝我不知道有關angular.equals()。我會看看它 – Nick

+0

它完全有效。謝謝 – Nick

1

的對象你是比較不具有相同的參考,所以==正在返回false。有關更詳細的解釋,請參見Object comparison in JavaScript

在這種特殊情況下,您可以簡單地比較日期的文本以查看它們是否平等。但是,這不適用於像函數名稱暗示的所有對象。

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

或者,你可以,如果你的陣列包括給定日期創建特定的檢查方法和簡化它極大地利用Array.prototype.some

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

更簡潔使用ES6箭頭功能:

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

array [i] === obj只會返回true,如果它是同一個對象的話。在你引用的鏈接中,被檢查的對象是插入到數組中的同一個對象,這就是爲什麼它返回true。在你的情況下,你正在創建一個新的對象「結果」並在其中添加值。所以數組不包含完全相同的對象,因此返回false。 如果'text'是對象中唯一的屬性,而不是檢查整個對象,你可以檢查兩個對象中的'text'屬性是否相同。

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

發生這種情況是因爲JS中的對象是通過引用進行比較,而不是通過它們的值進行比較。但是你需要通過它們的值來比較對象。所以你需要獲得一些第三方功能或編寫你自己的。另外一個選擇是使用角度內置的equalsfunction

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

爲了更好地理解,您可以閱讀關於此主題的好文章here

相關問題