2017-10-18 9 views
0

J'ai un objet qui pourrait être imbriqué aussi profondément que possible. J'essaie de déterminer si la propriété de l'objet ready a au moins une valeur false. Si c'est le cas, la fonction checkForFalse doit renvoyer false. J'ai été confus en utilisant la récursion pour résoudre ce problème. Quel appel récursif devrait retourner pour faire fonctionner ce code? Ou je me trompe complètement et manque quelque chose?Recursion mess en vérifiant les propriétés de l'objet

var obj = { 
 

 
    "currentServiceContractId": { 
 
     "ready": true, 
 
     "customerPersonId": { 
 
      "ready": false 
 
     } 
 
    }, 
 

 
    "siteId": { 
 
     "ready": true 
 
    }, 
 

 
    "districtId": {}, 
 

 
    "localityId": { 
 
     "ready": true 
 
    }, 
 

 
    "streetId": { 
 
     "ready": true 
 
    } 
 
}; 
 

 

 
function checkForFalse(mainObj) { 
 

 
    let ans = _.find(mainObj || obj, (val) => { 
 

 
     if (_.keys(val).length > 1) { 
 

 
      let readyObj = _.pick(val, 'ready'); 
 

 
      return checkForFalse(readyObj); 
 

 
     } else { 
 
      return _.get(val, 'ready') === false; 
 
     } 
 

 
    }); 
 

 
    return _.isEmpty(ans); 
 

 
} 
 

 
console.log(checkForFalse(obj));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

+0

Quel est précisément le problème? Quelle est la sortie par rapport à ce que vous attendez? – Carcigenicate

+0

Je m'attends à avoir console.log pour sortir 'false' si l'une des propriétés de l'objet nommée' ready' a la valeur 'false'. Maintenant, je reçois toujours la console 'false' enregistrée – tawreon

+1

Juste une observation. Vous avez une fonction nommée 'checkForFalse' que vous voulez retourner' false' s'il y a un faux. Pour moi, c'est un nom de fonction très trompeur. Sans savoir ce que la fonction faisait, je m'attendais par son nom à ce que 'checkForFalse' renvoie' true' si a trouvé un 'false'. – Keith

Répondre

0

Cette solution utilise _.every() récursive pour rechercher ready: false. La méthode _.every() retourne immédiatement lorsque le retour rappel false:

function checkForAllReady(mainObj) { 
 
    return _.every(mainObj, (value, key) => { 
 
    if(key === 'ready' && value === false) { 
 
     return false; 
 
    } 
 
    
 
    if(_.isObject(value)) { 
 
     return checkForAllReady(value); 
 
    } 
 
    
 
    return true; 
 
    }); 
 
} 
 

 
const obj = {"currentServiceContractId":{"ready":true,"customerPersonId":{"ready":true}},"siteId":{"ready":true},"districtId":{},"localityId":{"ready":true},"streetId":{"ready":true}}; 
 

 
console.log(checkForAllReady(obj)); 
 

 
const objWithFalse = _.merge({}, obj, { "streetId":{"ready":false} }) 
 
console.log(checkForAllReady(objWithFalse));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>