将常规 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);
}
})
});
重构后的版本没有按预期工作,我不知道为什么。
也许这对你有用。它为所有活动商品生成一个散列 table,并将其用于过滤非活动商品数组。
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 中移除 fn。
检查以下代码是否适合您。
angular.forEach(activeOffers, function(activeOffer) {
_.remove(notActiveOffers, function(notActiveOffer) {
return notActiveOffer.offerId === activeOffer.offerId;
});
});
我是 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);
}
})
});
重构后的版本没有按预期工作,我不知道为什么。
也许这对你有用。它为所有活动商品生成一个散列 table,并将其用于过滤非活动商品数组。
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 中移除 fn。
检查以下代码是否适合您。
angular.forEach(activeOffers, function(activeOffer) {
_.remove(notActiveOffers, function(notActiveOffer) {
return notActiveOffer.offerId === activeOffer.offerId;
});
});