返回Obj.key1.key2 ... keyN的最佳方法是什么?

时间:2014-10-21 19:12:10

标签: javascript

如果他们未定义,必须检查Obj.key1,Obj.key2,...,Obj.key(n-1)。

正常惯例是:

if (typeof Obj !== 'undefined') {
  if (typeof Obj.key1 !== 'undefined') {
    if (typeof Obj.key1.key2 !== 'undefined')
      ...
        if (typeof Obj.key1.key2...keyN !== 'undefined') {
          return Obj.key1.key2...keyN
        }
      ...
    }
  }
}

4 个答案:

答案 0 :(得分:2)

通常,代码会稍微缩短为

if (obj && obj.key1 && obj.key1.key2 && obj.key1.key2.key3) {
    return obj.key1.key2.key3.key4;
}

因为undefined也是假的,任何对象都是真的。

较短但IMO在逻辑上较为丑陋的替代方案是

try { return obj.key1.key2.key3.key4; } catch(e) { }
如果你从不使用Javascript属性,那么

可能是可以接受的,因为它可以隐藏非平凡访问者中的错误。

答案 1 :(得分:0)

var x;
try {
    x = Obj.key1.key2.key3.key4....keyN;
}
catch(err) {
   console.warn( err );
}

答案 2 :(得分:0)

我通常使用这段代码,我称之为解析属性。

function resolveProperty(object, property, deep) {
    if(typeof deep === 'undefined') {
        deep = true;
    }

    if(typeof property === 'string' && deep) {
        property = property.split('.');
    }

    if(!object) {
        return null;
    }

    if(!deep) {
        property = Array.isArray(property) ? property[0] : property;

        if(typeof property === 'undefined') {
            return object;
        } else {
            return object[property];
        }
    }

    return resolveProperty(object[property.shift()], property, property.length > 1);
}



$('#results').append(' > ' + resolveProperty({ a: {}}, 'a.b') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: {}}, 'a.b.c.d') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: { b: 1 }}, 'a.b') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: { b: 1 }}, 'a.b.c') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: { b: { c: '123' } }}, 'a.b.c') + '<br />');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="results" />

它将实际解析属性,以便您可以比较未定义的

if(resolveProperty(yourObject, 'a.b.c.d.e')) {
    //good to go
}

PS。:如果您要在浏览器中运行此代码,您可能想要替换阵列验证方法(Array.isArray),因为它不是默认的(跨浏览器)。

答案 3 :(得分:0)

我不一定推荐这种解决方案,但你可以做到

function getPath(obj, path) {
    return path.split(.).reduce(function(val, seg) {
        return val && typeof val === 'object' && val[seg];
    }, obj);
}

现在你可以做到

getPath(Obj, 'key1.key2.key3...keyN')

如果您是CoffeeScript用户,可以使用所谓的“存在操作员”:

Obj.key1?.key2?.key3?...keyN