2013-08-18 17 views
12

AngularJSを使用して、私のアプリケーションでaddTodo関数を作成しています。配列内の一意性をチェックし、ユニークで配列にプッシュ

私は、配列に追加されるオブジェクトの一意性をチェックし、その後に追加のアクションを実行する方法を実装するのに問題があるようです。

これまでのところ、追加のアクションは有効ですが、一意性の初期チェックはできません。一意性のアクションのチェックを実装してから、追加のアクションを続けるにはどうすればよいですか?

私はこの(太字が実装されていないことを意味)のようなフローを作成しようとしているaddTodo機能:藤堂はドス

1aにすでにある場合

  1. チェック。藤堂は空白

    2Aでない場合、それがexisitない場合は、プッシュしていないは、警告

  2. チェックを表示します。それが空白の場合は、プッシュしていない、現在の(unqiuenessチェックなし)addTodo機能

  3. ユニークでブランクでないとtodosにプッシュ、ディスプレイ成功メッセージ

場合、アラート

  • を表示:

    $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:あなたはjavascript配列indexOfメソッドを使用することができますtodo標準文字列を使用している場合は、警告

  • +0

    だから 'todo'は単純な文字列かオブジェクトですか? – Chandermani

    +0

    それは単純な文字列です。はい –

    +0

    あなたは私の答えをチェックしてくれることを願っています。 – Chandermani

    答えて

    18

    使用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]; 
        } 
    }; 
    
    +0

    素晴らしいです、ありがとうございます!私の主な問題は、アクションを実装するためのフローと、すでに持っているものに基づいて適切に実装する方法がどこにあるのかわからないということです。 –

    +0

    _他の人の注釈:_ mefのフローは、私が上で設定したフローとは異なりますが、実際にはそれを見る正しい方法です。まず、todoが空白であるかどうかを確認します。そうでない場合は、一意であるかどうかを確認します。下のコードで私の落とし穴は、私はそれが空白であるかどうかをチェックする前に、todoが一意であるかどうかを確認する必要があったという考えには余りにも付着していたということでした。 –

    0

    の可視性を切り替えます$scope.isVisible。オブジェクトデータ型のこのメソッドは、参照一致を行います。

    これ以外の場合は、jquery grepメソッドを参照することもできます。

    $scope.todosに既にこの要素が含まれているかどうかを確認し、アラートを表示するには、これらの方法のいずれかを使用します。

    +0

    それに基づいて、私はこのようなコードを編集しましたが、それでも複製物を配列にプッシュできるようになっています。 '$ 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]; } }; ' –

    1

    あなたはunderscore OR lodashを使用している場合、あなたは配列内のユニークなアイテムをプッシュするために、この単純なコードを使用することができます。

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

    関連する問題