在操作对象数组时,循环不按预期工作

时间:2016-12-18 21:36:04

标签: javascript angularjs arrays

我正在编辑一组对象。

此数组因用户选择而异,但通常如下所示:

[{boxID:0,name:"Apple Bread",weight:2}]

此数组声明为$scope.boxes

在高级别,此数组源自之前调用的函数,其重点是按重量将项目(例如Apple Bread)打包到框中,没有框超过总重量(在这种情况下) 6磅。因此,该数组填充了表示项目,其权重以及打包的boxID(0是第一个框)的对象。

我的问题是,我正在插入功能以让用户编辑该框,以便他们可以随机播放并自定义其框,同时仍然尊重总重量限制。

为了结束,我有一个功能,利用拖放功能让用户编辑和移动他们的框周围的项目。一旦完成,我需要验证哪个项目属于哪里。但我甚至无法使ondragstart功能正常工作。想法是ondragstart从数组中删除有问题的项目,然后重新计算所有框,通过以下内容:

$scope.boxyboxybox2 = function() {
   $scope.displayBoxes = [];
   for (var i = 0; i < $scope.boxes.length; i++) {
     if (i == 0) {
       $scope.displayBoxes.push({
         box: $scope.boxes[i].boxID,
         contents: [{
           name: $scope.boxes[i].name,
           weight: $scope.boxes[i].weight
         }]
       });
       console.log($scope.displayBoxes);
       continue;
     }
     for (var z = 0; z < $scope.displayBoxes.length; z++) {
       if ($scope.boxes[i].boxID == $scope.displayBoxes[z].box) {
         $scope.displayBoxes[z].contents.push({
           name: $scope.boxes[i].name,
           weight: $scope.boxes[i].weight
         })
         console.log($scope.boxes[i].boxID, $scope.displayBoxes[z].box, $scope.displayBoxes);
       } else {
         $scope.displayBoxes.push({
           box: $scope.boxes[i].boxID,
           contents: [{
             name: $scope.boxes[i].name,
             weight: $scope.boxes[i].weight
           }]
         });
         console.log($scope.displayBoxes);
         break;
       }
     }
   }
   console.log($scope.displayBoxes);
 }

以上不起作用,我没有正确使用breaks或其他东西,因为这种变化要么得到一个无限循环,要么我有一个对象数组(在displayBoxes中这是什么回到DOM)我有重复的地方,就像我有Box 3的多个实例一样,没有明显的理由。

很难搞清楚这一点。如果有必要的话,我可以做一名傻瓜,但我希望这只是一个很小的疏忽,因为我非常接近我的预期结果。

编辑:请求的Plunker:https://plnkr.co/edit/Bq6rgeOx26QTTu8d7AXh?p=preview

1 个答案:

答案 0 :(得分:0)

答案是硬代码z小于displayBoxes数组的长度。

for (var z = $scope.displayBoxes.length-1; z < $scope.displayBoxes.length; z++) {

这使break;在保持所需功能的同时生效。