Проверьте уникальность в массиве, нажмите на массив, если он уникален

Используя AngularJS, я создаю функцию addTodo в своем приложении.

Кажется, у меня возникла проблема с внедрением способа проверки уникальности добавляемого в массив объекта и последующего действия дополнительных действий.

Пока я могу получить дополнительные действия, но не первоначальную проверку на уникальность. Как я могу реализовать проверку на действие уникальности, а затем выполнить дополнительные действия?

Функция addTodo, я пытаюсь создать такие потоки ( Жирный означает не реализован):

  • Убедитесь, что todo уже находится в todos

    1а. Если он действительно существует, не нажимайте, не показывайте предупреждение

  • Проверьте, не закрыто ли todo

    2а. Если он пуст, не нажимайте, покажите предупреждение

  • Если уникальный, а не пустой, нажмите на 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 переключает видимость оповещения

Ответ 1

используйте 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];
  }
};

Ответ 2

если вы используете underscore ИЛИ lodash, вы можете использовать этот простой код для ввода уникальных элементов в массив.

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

Надеюсь, это поможет!!!

Ответ 3

Если вы используете стандартную строку todo, вы можете использовать массив javascript indexOf. Этот метод для типов данных объекта выполняет совпадение ссылок.

Иначе вы также можете посмотреть на метод jquery grep.

Используйте один из этих методов, чтобы проверить, содержит ли $scope.todos такой элемент и показывает предупреждение.