检查对象是否位于 localStorage 中的 AngularJS 数组中

Check if object is in AngularJS array that is in localStorage

本文关键字:中的 AngularJS 数组 localStorage 对象 是否 检查      更新时间:2023-09-26

我有这个angularjs数组:$scope.fav = []在函数调用中向其添加项目(对象(的地方。 这些对象的一个示例是{quote: "Some text", controller: some_controller} 当我向数组添加新对象时,该数组将保存在本地存储中。数组完全按照我想要的方式工作,除非当我尝试在 console.log(( 中打印它时,我得到了很多 [对象,对象],我只是假设这是它的打印方式。不过,这不是主要问题,因为数组可以根据需要工作。

我遇到的问题是试图查找对象是否已在数组中。我试过了

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

这似乎不起作用,因为每个进入的对象都是索引 -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 的负值。很抱歉冗长的复杂解释。

感谢您的见解,本

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

每次从本地存储中检索对象时,实际上都会创建一个新对象(可能使用 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;
}