2017-10-18 2 views
0

Ich habe ein Objekt, das so tief wie möglich geschachtelt werden könnte. Ich versuche festzustellen, ob die Objekteigenschaft ready mindestens einen falschen Wert hat. Wenn ja, sollte die checkForFalse Funktion false zurückgeben. Ich wurde verwirrt, während ich Rekursion benutzte, um dieses Problem zu lösen. Welcher Rekursionsaufruf sollte zurückkehren, damit dieser Code funktioniert? Oder ich liege völlig daneben und verpasse etwas?Rekursionsfehler beim Überprüfen der Objekteigenschaften

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

Was speziell ist das Problem? Was ist der Output gegenüber dem, was Sie erwarten? – Carcigenicate

+0

Ich erwarte, dass console.log die Ausgabe 'false' hat, wenn eine der Objekteigenschaften 'ready' den Wert 'false' hat. Jetzt bekomme ich immer 'falsche' Konsole geloggt – tawreon

+1

Nur eine Beobachtung. Sie haben eine Funktion namens 'checkForFalse', die Sie' false' zurückgeben möchten, wenn ein false vorliegt. Für mich ist das ein sehr irreführender Funktionsname. Ohne zu wissen, was die Funktion getan hat, würde ich mit ihrem Namen erwarten, dass 'checkForFalse'' true' zurückgeben würde, wenn ein 'false' gefunden würde. – Keith

Antwort

0

Diese Lösung verwendet _.every() rekursiv nach ready: false zu suchen. Die _.every() Methode wird sofort zurück, wenn der Rückruf zurück 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>

Verwandte Themen