关于判断是否存在某个字段有没有简便的方法!

比方说像这样一段代码

  const propAuths = flowDetailStore.flowData && 
      flowDetailStore.flowData.workflow && 
      flowDetailStore.flowData.workflow.propAuths

有没有简单的写法可以判断propsAuths是否存在!

阅读 2.6k
4 个回答

据我所知是有一个链判断运算符 的提案,不过最好还是不要用处于提案的特性。
loadsh里有个get的方法,可以参考一下。

自己写一个吧,递归或者循环寻找。

我刚才写了一个循环查找的:

Object.prototype.getField = function(fields) {
    if (!this || !fields || typeof this!=='object') {
        return null;
    }

    const _fields = fields.split('.');
    let ss = this, field = null;
    let i = 0;

    while(i<_fields.length) {
        field = _fields[i];
        if (field && ss[field]) {
            ss = ss[field]
        } else {
            return null;
        }
        i++;
    }
    return ss;
}

测试样例:

var flowDetailStore = {
    flowData: {
        workflow: {
            propAuths: 123456
        }
    }
}
flowDetailStore.getField('flowData.workflow.propAuths'); // 123456
flowDetailStore.getField('flowData.workflow'); // {propAuths: 123456}
flowDetailStore.getField('flowData'); // {workflow:{propAuths: 123456}}
flowDetailStore.getField('flowData11.workflow.propAuths'); // null
function has(obj, path) {
    var ret = false;
    if (obj && typeof obj === "object" && typeof path === "string") {
        path = path.split(".");
        ret = path.length > 0;
        for (var i = 0; i < path.length; ++i) {
            var key = path[i];
            if (key in obj) {
                if (obj[key]) obj = obj[key];
            } else {
                ret = false;
                break;
            }
        }
    }
    return ret;
}
console.log(has({ a: { b: { c: 1 } } }, "a.b.c"));

上lodash/try catch/自己写一个简易版的lodash.get

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题