2 votes

Existe-t-il un moyen d'interrompre une boucle forEach lorsque l'on atteint une certaine paire clé/valeur dans le tableau ?

Je suis encore très novice en matière de Javascript et de développement de logiciels en général, car il s'agit de mon premier emploi, et je suis actuellement en train de déboguer un défaut critique lié à la validation.

J'ai un scénario dans lequel j'ai un tableau, et dans ce tableau chaque produit a un attribut intitulé Volume unitaire avec un code ASC_Sales_Volume.

Le défaut actuel est que lorsqu'un utilisateur configure plus d'un produit, mais en laisse un avec un volume unitaire de zéro, l'utilisateur est toujours autorisé à naviguer vers la page suivante bien qu'il y ait un contrôle de validation en place pour empêcher cela. La condition qui empêcherait l'utilisateur d'avancer est la suivante $scope.bpTree.response.errorCheckVolume = true .

Avec ce qui est actuellement écrit par l'ancien développeur, la boucle forEach continue de changer le $scope.bpTree.response.errorCheckVolume en faux lorsque l'utilisateur clique sur le bouton pour déclencher les fonctions.

Le bouton Next lui-même est un composant OOTB que je ne peux pas modifier directement.

Quelle serait la prochaine étape pour résoudre ce problème ? En fait, lorsque le forEach évalue un produit dont le volume unitaire est égal à 0, le paramètre $scope.bpTree.response.errorCheckVolume doit toujours être égal à true, quelles que soient les valeurs de volume unitaire ultérieures, jusqu'à ce que l'utilisateur modifie la valeur du volume unitaire pour ce produit particulier, puis clique sur le bouton Next et que la logique s'enclenche à nouveau. Si les enregistrements d'erreur (c'est-à-dire tout produit du tableau dont le volume unitaire est égal à 0) sont supérieurs à zéro, errorCheckVolume doit toujours être égal à true et l'utilisateur ne doit pas pouvoir progresser.

Est-ce que j'utiliserais quelque chose de similaire à Array.prototype.some() ? J'ai regardé mon écran pendant des heures en essayant différentes choses en vain.

Voici l'extrait de code :

function validateAllPlansUnitVolume(triggeredFromNextBtn) {
         var coveragesData = $scope.sortedCoverages[$scope.childProduct.instanceKey || $scope.childProduct.productName || $scope.childProduct.Name],
            errorRecords = checkForInvalidPlans(coveragesData, triggeredFromNextBtn);
            if(errorRecords > 0) {
               $scope.bpTree.response.errorCheckVolume = true;

            }
            else {
                $scope.bpTree.response.errorCheckVolume = false;
            }
     }

function checkForInvalidPlans(coveragesData, triggeredFromNextBtn){
        if(!!coveragesData && coveragesData.length) {
            coveragesData.forEach(function(product){
                if(!!product.attributeCategories){
                    unitVolumeAttrNodes = product.attributeCategories.records[0].productAttributes.records.filter((ele) => ele.code == "ASC_Sales_Volume");
                    if(!!unitVolumeAttrNodes && unitVolumeAttrNodes.length){
                        unitVolumeAttrNodes.forEach(function(attrNode){
                             if(unitVolumeAttrNodes[0].userValues === 0){
                                   $scope.bpTree.response.errorCheckVolume = true;
                                    product.unitVolumeErr = true;
                                    product.unitVolumeErrMsg = "Unit Volume cannot be zero. Please update before proceeding to the next screen"; 
                            }
                                else {
                                    product.unitVolumeErrMsg = "";
                                    product.unitVolumeErr = false;
                                    $scope.bpTree.response.errorCheckVolume = false;
                                    }
                        });
                    }
                }
            });

            return coveragesData.filter((ele) => ele.unitVolumeErr).length;
        }

        return 0;
    }

0voto

Shahid Islam Points 350

Je vous suggère d'utiliser Array.prototype.some() Ce n'est pas une bonne pratique d'utiliser la boucle foreach et de l'interrompre en fonction de la condition. Js a différentes méthodes de tableau pour différents travaux. Je pense que pour différentes exigences, ils ont créé des méthodes construites, sinon nous pouvons utiliser une seule méthode pour tous les travaux, Visitez cette page et sélectionnez la méthode de l'array qui correspond à vos besoins.

0voto

GirkovArpa Points 3312

Vous ne pouvez pas faire cela avec .forEach mais vous pouvez avec .some :

['a', 'b', 'c'].some((element, index) => {
    console.log(element);
    return element == 'b' || index == 1;
}); 

Ce code enregistre chaque élément du tableau, en interrompant la boucle lorsqu'elle atteint 'b' ou l'index 1 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X