繁体   English   中英

将常规for循环重构为angular.forEach

[英]Refactor regular for loop into angular.forEach

我是js的新手,并且坚持重构以下代码:

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

重构的版本无法正常工作,我不知道为什么。

也许这对你有用。 它为所有活动要约生成一个哈希表,并将其用于过滤非活动要约数组。

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

您要从数组中删除项目,同时仍要对其进行迭代-这非常容易出错,应该避免。

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

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

是的,您不能在迭代时从阵列中删除项目。

您可以使用lodash中的remove fn。

检查以下代码是否适合您。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM