2017-10-18 106 views
0

我有一個可以嵌套儘可能深的對象。我試圖確定對象的屬性ready是否至少有一個錯誤值。如果是的話checkForFalse函數應該返回false。我在使用遞歸來解決這個問題時感到困惑。什麼遞歸調用應該返回使這個代碼工作?或者我完全錯了,錯過了什麼?檢查對象屬性時發生遞歸混亂

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

具體什麼問題?什麼是輸出與你的期望? – Carcigenicate

+0

如果任何名爲'ready'的對象屬性具有'false'值,我希望console.log輸出'false'。現在我總是得到'虛假'控制檯登錄 – tawreon

+1

只是一個觀察。你有一個名爲'checkForFalse'的函數,如果有錯誤,你想返回'false'。對我來說,這是一個非常具有誤導性的函數名稱。不知道該函數做了什麼,我希望通過它的名稱'checkForFalse'將返回'true',如果發現'false'。 – Keith

回答

0

該解決方案使用_.every()遞歸搜索ready: false。當回調返回false_.every()方法會立即返回:

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>