检查数组中的唯一性,如果是唯一的则推送到数组

时间:2013-08-18 10:36:06

标签: javascript arrays angularjs push

使用AngularJS,我在我的应用程序中创建了一个addTodo函数。

我似乎无法实现一种方法来检查添加到数组中的对象的唯一性,并让其后跟其他操作。

到目前为止,我能够使其他操作正常工作,但不能初步检查唯一性。如何实现对唯一性操作的检查,然后执行其他操作?

addTodo函数我试图像这样创建流程(粗体表示未实现):

  1. 检查todo是否已经存在待办事项

    1a上。 如果确实存在,请不要按,显示警告

  2. 检查待办事项是否为空白

    2a上。如果是空白,请不要按,显示警告

  3. 如果是唯一而非空白,请按下待办事项,显示成功消息

  4. 当前的addTodo函数(没有unqiueness检查):

    $scope.addTodo = function(){
      $scope.isVisible = true;
      if ($scope.todo) {
        $scope.todos.push($scope.todo);
        $scope.todo = '';
        $scope.alert = $scope.alerts[1];
      }else{
        $scope.alert = $scope.alerts[0];
      }
    };
    

    注1:$scope.alert$scope.alerts用于显示某些错误消息;

    $scope.alerts[0]
    

    “请在您的任务中添加文字。”

    $scope.alerts[1]
    

    “添加了新任务!”

    如果正在添加的任务已存在,我想显示的警报是

    $scope.alerts[3] 
    

    “任务已在列表中。”

    注2:$scope.isVisible切换警报的可见性

3 个答案:

答案 0 :(得分:21)

以这种方式使用Array.indexOf

$scope.addTodo = function(){
  $scope.isVisible = true;
  if ($scope.todo) {
    if ($scope.todos.indexOf($scope.todo) == -1) {
        $scope.todos.push($scope.todo);
        $scope.todo = '';
        $scope.alert = $scope.alerts[1];
    }else{
     // $scope.todo is already in the $scope.todos array, alert the user
        $scope.alert = $scope.alerts[3];
    }
  }else{
    $scope.alert = $scope.alerts[0];
  }
};

答案 1 :(得分:1)

如果您使用underscorelodash,则可以使用此简单代码来推送数组中的唯一项。

if (_.findWhere($scope.todos, $scope.todo) == null) {
    $scope.todos.push($scope.todo);
}

希望这有帮助!!!

答案 2 :(得分:0)

如果您使用的是标准字符串todo,则可以使用javascript数组indexOf方法。对象数据类型的此方法执行引用匹配。

另外,您还可以查看jquery grep方法。

使用其中一种方法检查$scope.todos是否已包含此类元素并显示警告。