【问题标题】:Check if object is in AngularJS array that is in localStorage检查对象是否在 localStorage 中的 AngularJS 数组中
【发布时间】:2014-06-06 07:12:13
【问题描述】:

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

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

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 的负值。 很抱歉冗长复杂的解释。

感谢您的洞察力, 本

【问题讨论】:

    标签: javascript arrays angularjs local-storage


    【解决方案1】:

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

    【讨论】:

    • 非常感谢 Anthony,这是一个相当简单的解决方案。干杯,本
    【解决方案2】:

    每次从本地存储中检索对象时,实际上是在创建一个新对象,可能使用 JSON.decode 将存储在本地存储中的字符串数据转换为对象。

    即使新对象包含相同的数据,与现有(尽管表面上相同)对象相比,它也会通过严格的测试===(实际上是松散的==)。 indexOf 使用严格的相等运算符 ===,因此其行为方式相同。

    所以你需要一些代码来测试一个对象是否等于另一个对象,然后将它应用到一个列表中。一种方法是使用angular.equalsfilter 的组合,它执行对象的深度比较:

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

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多