【问题标题】:AngularJS checking if an object has a specific valueAngularJS 检查对象是否具有特定值
【发布时间】:2017-06-23 08:19:20
【问题描述】:

我正在努力避免重复。如果我再次发送相同的名字(比如 Jason),我不希望它第二次被添加到 $scope.people。添加前如何检查?

$scope.people = [
  {
    name : "Jason",
    age : 26,
    height : 176,
  },
  {
    name : "Mark",
    age : 34
    height : 190
  }
];

$scope.add = function(name,age,height) {
  // How can I make sure that Jason or Mark won't get added again?
}

如果它是一个简单的数组,我会像下面这样解决它,但这是不同的。

$scope.add = function (name) {
  if ($scope.people.indexOf(name) == -1) {
    $scope.people.push(name);
  }
};

【问题讨论】:

  • 嗯,如果有另一个“杰森”,年龄26岁,身高176,该怎么办?地球上有很多人类。也许您会使用称为 ID 的独特标识符。
  • 我只想检查名称,不会有任何重复的名称,因为它是我保存在数据库中的预定义列表。实际上它们是 ID(所以我想检查 ID),但为了简单起见,我将其更改为名称。

标签: angularjs javascript-objects


【解决方案1】:

您可以使用AngularJS equals,如下例所示。这是处理此类逻辑的常用 AngularJS 方式。好吧,这个解决方案将完全比较两个对象,而不是只比较一个对象的一个​​属性。

    $scope.add = function(name, age, height) {

        //init
        var found = false;

        //equal logic
        angular.forEach($scope.people, function (people) {
            if (angular.equals(people, {
                    name: name,
                    age: age,
                    height: height
                })) {
                found = true; //set found state
                return; // break angular.forEach()
            }
        });

        //proceed
        if (!found) {
            $scope.people.push({
                name: name,
                age: age,
                height: height
            });
        }
    };

【讨论】:

  • Aaaaa 成功了。非常感谢。我会在 4 分钟内接受这个答案。
【解决方案2】:

我从 StackOverflow 帖子中获得了这段代码 sn-p,但我现在找不到。但这应该可以解决问题:

   function unique(collection, keyname) {
    var output = [],
        keys = [];

    angular.forEach(collection, function (item) {
        var key = item[keyname];
        if (keys.indexOf(key) === -1) {
            keys.push(key);
            output.push(item);
        }
    });
    return output;
};

用法:

$scope.people = unique(jsonArray, 'name');

【讨论】:

  • 谢谢,即使@lin 的方法有效,我也会调查一下。赞成。
【解决方案3】:

$.grep 在这里可能会帮助你

var result = $.grep(people, function(e){ return e.name == x.name; });

result 将是一个匹配数组,因此您将知道是否有任何匹配。

【讨论】:

  • 谢谢,即使@lin 的方法有效,我也会调查一下。赞成。
【解决方案4】:

您可以使用 $filter 轻松找到这样的现有人

$scope.people = [{
    name: "Jason",
    age: 26,
    height: 176,
  }, {
    name: "Mark",
    age: 34,
    height: 190
  }];

  $scope.add = function(name, age, height) {
    if(doesntExist(name)){
      $scope.people.push({name: name, age: age, height: height})
    }
  }

  function doesntExist(name){
    return $filter('filter')($scope.people, {name: name}).length === 0
  }

工作的笨蛋 http://plnkr.co/edit/4z4ofqTMUH4rMzpoIsI5?p=preview

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 2013-03-25
    • 2018-06-15
    • 2016-07-10
    • 2019-03-31
    • 2020-05-12
    • 2017-10-09
    • 2021-03-12
    相关资源
    最近更新 更多