【问题标题】:Recursion mess while checking object properties检查对象属性时递归混乱
【发布时间】:2017-10-18 21:32:59
【问题描述】:

我有一个可以嵌套尽可能深的对象。我试图确定对象的属性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>

【问题讨论】:

  • 具体是什么问题?输出与您的期望是什么?
  • 如果任何名为ready 的对象属性具有false 值,我希望console.log 输出false。现在我总是收到false 控制台记录
  • 只是一个观察。你有一个名为checkForFalse 的函数,如果有错误,你想返回false。对我来说,这是一个非常具有误导性的函数名称。在不知道该函数做了什么的情况下,我预计如果找到 falsecheckForFalse 将返回 true
  • @Keith 是对的。像checkForAllReady 这样的东西会更好地反映该方法背后的想法。

标签: javascript object recursion lodash traversal


【解决方案1】:

此解决方案使用_.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>

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 2021-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多