检查数组中是否唯一,如果唯一则添加到数组

14

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

我似乎遇到了实现检查正在添加到数组中的对象唯一性的问题,并在其后跟随其他操作。

到目前为止,我能够使附加操作正常工作,但无法进行初始的唯一性检查。我该如何实现唯一性检查并在其后跟随其他操作?

我试图创建的addTodo函数流程如下(加粗表示未实现):

  1. 检查todo是否已经存在于todos中

    1a. 如果它已经存在,则不要推入并显示警报

  2. 检查todo是否为空

    2a. 如果为空,则不要推入并显示警报

  3. 如果唯一且不为空,则推入todos,并显示成功消息

当前的addTodo函数(不包括唯一性检查):

$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 可以切换警告框的可见性。


那么 todo 是一个简单的字符串还是一个对象? - Chandermani
这是一个简单的字符串,是的。 - James Cliburn
希望你已经检查过我的答案了。 - Chandermani
我已经有了,谢谢!给它添加一个注释。 - James Cliburn
3个回答

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

太棒了,谢谢!解决了我主要的问题,不确定在流程中何时实施该操作以及如何根据我已有的内容正确实施它。 - James Cliburn
其他人请注意:mef的流程与我上面建立的流程不同,但实际上是正确的方式:首先,检查待办事项是否为空。如果不是,则检查它是否唯一。我在下面的代码中犯了错误,因为我太过于执着于需要先检查待办事项是否唯一,然后再检查它是否为空。 - James Cliburn

2
如果你正在使用 underscorelodash,你可以使用这段简单的代码将唯一的元素推入数组。
if (_.findWhere($scope.todos, $scope.todo) == null) {
    $scope.todos.push($scope.todo);
}

希望这有所帮助!

0
如果您正在使用标准字符串todo,则可以使用JavaScript数组indexOf方法。对象数据类型的此方法执行引用匹配。
否则,您还可以查看jquery grep方法。
使用这些方法之一来检查$scope.todos是否已经包含这样的元素,并显示警报。

根据这个,我已经编辑了代码,但它仍然允许重复的内容被推送到数组中;$scope.addTodo = function(){ $scope.isVisible = true; var todos = $scope.todos; var todo = $scope.todo; if (todo == todos.indexOf(todo)){ $scope.alert = $scope.alerts[3]; } else if ($scope.todo) { $scope.todos.push($scope.todo); $scope.todo = ''; $scope.alert = $scope.alerts[1]; } else { $scope.alert = $scope.alerts[0]; } }; - James Cliburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接