2014-04-22 55 views
1

我有這個angularjs數組:$scope.fav = []其中項目(對象)在函數調用中被添加到它。這些對象的一個​​示例是{quote: "Some text", controller: some_controller}當我將新對象添加到數組時,該數組保存在localstorage中。除了當我嘗試在console.log()中打印它時,數組的工作原理完全是我想要的。我得到了很多[object,Object],我只是假設它是打印的方式。這不是主要問題,但因爲數組的工作方式需要。檢查對象是否在localStorage中的AngularJS數組中

我遇到的問題是嘗試查找對象是否已經在數組中。我曾嘗試

if ($scope.fav.indexOf({quote: q, controller: c}) == -1)

,這似乎並沒有工作,因爲每個對象都將在爲索引;即使是已經在數組中。我認爲這是因爲它沒有正確讀取對象。

最後我已經使出此功能:

$scope.containsObject = function(obj, list) { 
var i; 
for (i = 0; i < list.length; i++) { 
    if (list[i] === obj) { 
     return true; 
    } 
} 

return false; 

}

,檢查如果對象是在數組中。這裏是我把它叫做:

$scope.addToFav = function(q, c) { 
    $scope.value = $scope.containsObject({quote: q, controller: c}, $scope.fav) 
    console.log($scope.value); 

}

我一直得到了$ scope.value負值,即使對象是在數組中。 對不起,複雜的解釋很長。

謝謝你的洞察力, 本

回答

7

Array.indexOf()===操作比較對象引用和比較對象引用的同一個實例時是唯一的真實。與數組中的對象相比,{quote: q, controller: c}是完全不同的對象實例,即使它的屬性與數組中的對象完全匹配。

Angular具有名爲angular.equals()的幫助函數,該函數檢查2個對象是否相等。您可以代替===的使用它...

$scope.containsObject = function(obj, list) { 
    var i; 
    for (i = 0; i < list.length; i++) { 
     if (angular.equals(list[i], obj)) { 
      return true; 
     } 
    } 

    return false; 
}; 
+0

謝謝你這麼多,安東尼,這是一個相當簡單的解決方案。乾杯,本 – benjipelletier

2

每次你檢索從本地存儲的對象時,你實際上是創建一個新的對象,可能使用JSON.decode,將字符串轉換將數據存儲在本地存儲器中,放入對象中。

即使新對象包含相同的數據,但與現有(儘管明顯相同)對象相比,嚴格測試===(實際上,寬鬆==)也會失敗。 indexOf使用嚴格的相等運算符===,所以這將表現相同的方式。

因此,您需要一些代碼來測試對象是否與另一個對象相同,然後將其應用於列表。一種方法是使用angular.equals組合,執行對象的深比較和filter

$scope.containsObject = function(obj, list) { 
    return list.filter(function(listItem) { 
    return angular.equals(listItem, obj) 
    }).length > 0; 
} 

filter功能我不相信這是IE8的一部分。如果您需要IE8的支持,可以使用polyfill,或使用其他庫,像lo-dash

$scope.containsObject = function(obj, list) { 
    return _.filter(list, function(listItem) { 
    return angular.equals(listItem, obj) 
    }).length > 0; 
} 
相關問題