2016-06-14 48 views
0

我是新来的js坚持了重构:定期对循环到angular.forEach

for (var i = vm.notActiveOffers.length - 1; i >= 0; i--) { 
       for (var j = 0; j < vm.activeOffers.length; j++) { 
        if (vm.notActiveOffers[i] && (vm.notActiveOffers[i].offerId === vm.activeOffers[j].offerId)) { 
         vm.notActiveOffers.splice(i, 1); 
        } 
       } 
      } 

重构后:

angular.forEach(vm.notActiveOffers, function(notActiveOffer) { 
       angular.forEach(vm.activeOffers, function(activeOffer) { 
        if(notActiveOffer && (notActiveOffer.offerId === activeOffer.offerId)) { 
         vm.notActiveOffers.splice(_.indexOf(vm.notActiveOffers, notActiveOffer), 1); 
        } 
       }) 
      }); 

如预期的重构版本不起作用我无法弄清楚为什么。

+0

你可以给我们提供'vm.notActiveOffers'内容吗?预期的结果是什么? – Mistalis

+0

@Bavi Gurunath它不会工作,因为你试图找到一个数组内的对象的位置。你需要为此编写自己的自定义函数。 – NightsWatch

+1

那只是重构缓慢 – YOU

回答

0

雅,你不能从数组中删除一个项目,而迭代它。

您可以使用从lodash中删除fn。

检查下面的代码是否适合您。

angular.forEach(activeOffers, function(activeOffer) {  
    _.remove(notActiveOffers, function(notActiveOffer) { 
     return notActiveOffer.offerId === activeOffer.offerId; 
    });  
}); 
0

也许这适合你。它为所有活动提供生成一个哈希表,并用它来过滤不活动的提供数组。

var activeOffers = Object.create(null); 

vm.activeOffers.forEach(function (a) { 
    activeOffers[a.offerId] = true; 
}); 

vm.notActiveOffers = vm.notActiveOffers.filter(function (a) { 
    return !activeOffers[a.offerId]; 
}); 
+0

是的,这有效。谢谢。 –

0

您正在从一个数组中删除项目,同时仍然迭代它 - 这是非常容易出错的,应该避免。

您发布的2个代码片段之间的区别在于访问数组元素的顺序。在第一种情况下,数组将从最后一个元素迭代到第一个元素,并且您将从其后部移除元素(您已经遍历的元素)。在第二种情况下,您正在从阵列前端移除元素,因此可能不会遍历某些数组元素。

重构的版本不应该从数组中删除元素,同时仍然迭代它,我想。