2016-09-21 9 views
0
  1. 配列の名前がorderInfoのときに、配列のオブジェクトの値が等しいかどうかを確認するにはどうすればいいですか(たとえば、古いものと同じ新しい日付と時刻を追加しようとしているとします)、 'indexOf'または 'angular.equals'メソッド?配列内のオブジェクトを比較するには、equalsまたはindexOf -1を使用しますか?

  2. if文を渡すので、配列からのチェックはどうすればよいですか?

    $scope.orderInfo = [{date: '11.11.2011', time: 8}, 
           {date: '11.11.2005', time: 8}]; 
    

    場合($ scope.orderInfo.indexOf(時間)=== -1){

     $scope.orderInfo.push({date: pvmr, time: aikas}); 
    
        $scope.errortextt = "info added"; 
    
    
        } else { 
        $scope.errortextt = "already on list"; 
        } 
    

または

$scope.containsObject = function (orderInfo, time) { 
    var i; 
    for (i = 0; i < orderInfo.length; i++) { 
     if (angular.equals(orderInfo[i], time)) { 


      $scope.errortextt = "already on list"; 
      return true; 
     } 
    } 
    $scope.orderInfo.push({date: pvmr, time: aikas}); 

     $scope.errortextt = "info added"; 
    return false; 
}; 

答えて

0

indexOfは、実際に配列にあるオブジェクトへの参照を与えない限り(同じ値を持たないオブジェクトではなく)数字でも配列でもない場合にのみ機能します。 angular.equals関数は、オブジェクトのプロパティの等価性を個別にチェックして、それらが等しいかどうかを判断します。

個人的には、この特定の問題を解決する最良の方法は、値を持っているかどうかを判断するために「ハッシュマップ」として別のオブジェクトを使用することです。この方法でループを繰り返す必要はなく、難易度は、例えば値をチェック/保存するための独自の「キー」を考え出すである:

var orderInfoIndex = {}; 
$scope.containsObject = function (orderInfo, time) { 
    if (orderInfoIndex[time.toString()]) { 
    $scope.errortextt = "already on list"; 
    return true; 
    } 

    orderInfoIndex[time.toString()] = true; 

    $scope.orderInfo.push({date: pvmr, time: aikas}); 

    $scope.errortextt = "info added"; 
    return false; 
}; 
+0

このチップのためのThx、それは働いた!しかし、次の問題が来たら、私はそれを下にタイプします。 – edu

0

あなたは第二の方法で行く必要があります:

​​
0

私は以上の時間、あなたは同じ日付を追加傾けることを、確認するためにその.containsObject()関数を使用しています一度。このソリューションは、ボタンひとつで完璧に動作しますが、私はこのようなボタンの配列があります

$scope.times = [8, 9, 10]; 

HTML

<ul> 
     <li class="items" ng-repeat="time in times"> 
      <button class="button" ng-click="containsObject(time, date)">{{time}}</button> 
     </li> 
    </ul> 

「日付」momentJs日付オブジェクトがあるし。

問題: オブジェクトを追加してcontainsObject()で等価性をチェックすると、 'times'-arrays numbers'がすべて追加されるまで項目が追加されます。 1つの時間/日付コンボを日付ごとに一覧表示するだけで、残りの部分はリストに表示されます。

$scope.orderInfoIndex{}; 

$scope.containsObject = function (aikas, pvmr) { 
    if ($scope.orderInfoIndex[pvmr] && $scope.orderInfoIndex[aikas]) { 
     $scope.errortextt = "already on list"; 
     return true; 



    } 
     $scope.orderInfo.push({date: pvmr, clock: aikas}); 

     $scope.orderInfoIndex[pvmr] = true; 
     $scope.orderInfoIndex[aikas] = true; 



     $scope.errortextt = "info added"; 
     return false; 

}; 

例:私は、日付を変更するとき {date:"2016-09-29T09:00:00.000Z","clock":8}, {date:"2016-09-29T09:00:00.000Z","clock":9}, {date:"2016-09-29T09:00:00.000Z","clock":10} が、その後(29-> 30)、私は1つのオブジェクトのみをプッシュすることができます。

{date:"2016-09-30T09:00:00.000Z","clock":8} 

私は同じ日に他のオブジェクトをプッシュしようとした場合、と別の時計では、それは許可されていないし、すでに 'リスト上にある'と言われています

質問: 1.時間配列の作業を日付の変更と一緒にすると、選択している日付に応じて時刻、日付を一緒にチェックできますか?

ボーナス:どのように特定の選択を元に戻したり削除したりすることができますか?私は正しい日付をtime-button-valueに戻しますか?

関連する問題