比较数组中的对象,我使用equals还是indexOf -1?

时间:2016-09-21 17:16:28

标签: angularjs arrays

  1. 如何检查数组对象值的相等性(假设我试图添加新的日期和时间,与旧的相同),当我有名为orderInfo的数组时,我是否需要使用'indexOf '或'angular.equals'方法?

  2. 我如何从数组中检查,因为这些传递了if语句?

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

    if($ scope.orderInfo.indexOf(time)=== -1){

         $scope.orderInfo.push({date: pvmr, time: aikas});
    
         $scope.errortextt = "info added";
    
    
         } else {
         $scope.errortextt = "already on list";
         }
    
  3. $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;
    };
    

3 个答案:

答案 0 :(得分:0)

你应该采用第二种方法:

angular.equals(obj1,obj2);

答案 1 :(得分:0)

indexOf只有在数字或字符串数​​组不是对象的情况下才有效,除非您实际为它提供了对数组中对象的引用(不是具有相同值的对象)。 angular.equals函数将分别检查对象属性的相等性,以确定它们是否相等&#34;。

个人认为解决这个特定问题的最佳方法是使用另一个对象作为&#34;哈希映射&#34;为了确定你是否有价值,这种方式无需循环或进行深度比较,唯一的困难是提出你独特的关键&#34;用于存储/检查值,例如:

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

答案 2 :(得分: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>

&#39; date&#39;是一个约会对象。

问题: 当添加对象并检查与containsObject()的相等性时,它会正确添加项目,直到所有&#39; -arrays数字&#39;已被添加&#39;。然后它只按一个时间/日期组合列出每个日期,并说休息,他们已经在列表中,即使他们不是。

$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)时,我只能推送一个对象:

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

如果我尝试将其他对象推送到同一日期,使用不同的时钟,则不允许并且已经在列表中说“

问题: 1.如何将时间数组与日期更改结合起来,以便根据您选择的日期一起检查时间,日期?

奖励:我如何反向/删除特定选择,所以我返回正确的日期时间按钮值?