重新定义for循环到angular.forEach

时间:2016-06-14 11:24:44

标签: javascript angularjs lodash

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

重构版本无法按预期工作,我无法弄清楚原因。

3 个答案:

答案 0 :(得分: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];
});

答案 1 :(得分:0)

你正在迭代它时从数组中删除项目 - 这非常容易出错,应该避免。

您发布的两个代码段之间的差异在于访问数组元素的顺序。在第一个场景中,数组从最后一个元素迭代到第一个元素,并且您要从其后面移除元素(已经遍历的元素)。在第二种情况下,您将从数组前面删除元素,因此可能不会遍历某些数组元素。

重构版本不应该在迭代时删除数组中的元素,我想。

答案 2 :(得分:0)

Ya,您在迭代时无法从数组中删除项目。

你可以在lodash中使用remove fn。

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

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