2017-02-06 6 views
1

Я стараюсь избегать дубликатов. Если я снова отправлю одно и то же имя (скажем, Джейсон), я не хочу, чтобы он был добавлен в $ scope.people во второй раз. Как я могу проверить его перед добавлением?AngularJS проверяет, имеет ли объект определенное значение

$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); 
    } 
}; 
+1

Ммм, что должно случился, если есть другой «Джейсон» с возрастом 26 и высоты из 176? На Земле много людей. Возможно, вы собираетесь использовать идентификаторы unqiue, называемые идентификаторами. – lin

+0

Я только хочу проверить имена, не будет никаких дубликатов имен, так как это предварительно определенный список, который я храню в базе данных. На самом деле они были ID (поэтому я хочу проверить ID), но я изменил его на имена, чтобы сделать его простым. – salep

ответ

2

Вы можете использовать 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 
      }); 
     } 
    }; 
+0

Aaaaaand это сработало. Большое спасибо. Я приму это как ответ за 4 минуты. – salep

+0

Рад помочь, приветствия. – lin

1

У меня есть этот фрагмент кода из сообщения StackOverflow, который я не могу найти прямо сейчас. Но это следует сделать трюк:

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'); 
+0

Спасибо, хотя метод @ lin работал, я тоже рассмотрю это. Upvoted. – salep

1

$ .grep может помочь вам здесь

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

результат будет массив матчей, так что вы узнаете, есть ли совпадение или нет.

+0

Спасибо, хотя метод @ lin работал, я тоже посмотрю на это. Upvoted. – salep

0

вы можете использовать $ фильтр легко найти существующие человек, как этого

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

рабочего plunker http://plnkr.co/edit/4z4ofqTMUH4rMzpoIsI5?p=preview