繁体   English   中英

获取多级javascript对象属性的简单方法

[英]Easy way to get multi-level javascript object property

我总是需要处理不确定属性是否存在的多级js对象:

try { value1 = obj.a.b.c; } catch(e) { value1 = 1; }
try { value2 = obj.d.e.f; } catch(e) { value2 = 2; }
......

有没有更简单的方法或不需要很多尝试捕获的泛型函数(例如ifnull(obj.def,2))?

var value1 = (obj.a && obj.a.b && obj.a.b.c) || 1;

http://jsfiddle.net/DerekL/UfJEQ/

或使用此:

function ifNull(obj, key, defVal){
    var keys = key.split("."), value;
    for(var i = 0; i < keys.length; i++){
        if(typeof obj[keys[i]] !== "undefined"){
            value = obj = obj[keys[i]];
        }else{
            return defVal;
        }
    }
    return value;
}

var value1 = ifNull(obj, "a.b.c", 1);

您总是可以创建一个辅助函数。

function isUndefined(root, path, defaultVal) {
    var parts = path.split('.'),
        i = 0,
        len = parts.length,
        o = root || {}, v;

    while ((typeof (v = o[parts[i]]) === 'object', o = v) && ++i < len);

    return (typeof v === 'undefined' || i !== len)? defaultVal: v;

}

var obj = {a: { b: { test: 'test' }}}, v;
v = isUndefined(obj, 'a.b.test', 1); //test
v = isUndefined(obj, 'a.test', 1); //1

使用lodash,您可以轻松做到这一点**(节点存在,并且对该节点进行空检查)**。

var lodash = require('lodash-contrib');

function invalidateRequest(obj, param) {
    var valid = true;

    param.forEach(function(val) {
        if(!lodash.hasPath(obj, val)) {
            valid = false;
        } else {
            if(lodash.getPath(obj, val) == null || lodash.getPath(obj, val) == undefined || lodash.getPath(obj, val) == '') {
                valid = false;
            }
        }
    });
    return valid;
}

用法:

leaveDetails = {
              "startDay": 1414998000000,
              "endDay": 1415084400000,
              "test": { "test1" : 1234 }
    };

    var validate;

    validate = invalidateRequest(leaveDetails, ['startDay', 'endDay', 'test.test1']);

它将返回布尔值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM