2013-02-02 106 views
1

可能重复:
Accessing nested JavaScript objects with string key如何从Javascript中的参数访问对象中的对象?

我具备的功能

function _get(name) { 
return plugin._optionsObj[name] !== undefined ? 
    plugin._optionsObj[name] : plugin._defaults[name]; 
} 

我希望能有我的_defaults对象的内部对象,但后来我不不知道如何检索它们,但只使用一组方括号。

plugin._defaults = { 
    val1: 1, 
    val2: 2, 
    obj1: { 
     someVal: 3 
    } 
} 

是否有可能从我上面的功能访问 'someVal'?我尝试传递'obj1.someVal'作为参数,但它不起作用。想法?

编辑:我找到了一个解决方案,我把它公布在下面作为答案。我写了一个非常漂亮的小函数,通过字符串来检查嵌套值,并且我不必为了实现而更改功能。我希望这可以帮助任何处于类似情况的人。

+0

return plugin._optionsObj [name]!== undefined? plugin._optionsObj [name]:plugin._defaults [obj1] [someVal];不起作用? – lelloman

+1

看到这个要点:https://gist.github.com/3208381#file __。deep.js ...如果你使用Underscore,你只需将路径(例如'obj1.someVal')作为一个字符串传递,并且它遍历该对象图找到嵌套值。 –

+0

我期待着看看是否有办法解决这个问题,而不改变我的功能或实现它。 – Klik

回答

0

我发现这个问题的解决方案,至少一个将容纳自己,我想情况下,它可以帮助别人解决这个问题分享。我最大的困难是,我不知道嵌套值的深度,所以我想找到一个解决方案,可以为深层嵌套对象工作,而不需要重新设计任何东西。

/* Retrieve the nested object value by using a string. 
    The string should be formatted by separating the properties with a period. 
    @param obj    object to pass to the function 
      propertyStr  string containing properties separated by periods 
    @return nested object value. Note: may also return an object */ 

function _nestedObjVal(obj, propertyStr) { 
var properties = propertyStr.split('.'); 
if (properties.length > 1) { 
    var otherProperties = propertyStr.slice(properties[0].length+1); //separate the other properties 
     return _nestedObjVal(obj[properties[0]], otherProperties); //continue until there are no more periods in the string 
} else { 
    return obj[propertyStr]; 
} 
} 


function _get(name) { 
    if (name.indexOf('.') !== -1) { 
    //name contains nested object 
     var userDefined = _nestedObjVal(plugin._optionsObj, name); 
     return userDefined !== undefined ? userDefined : _nestedObjVal(plugin._defaults, name); 
    } else { 
     return plugin._optionsObj[name] !== undefined ? 
     plugin._optionsObj[name] : plugin._defaults[name]; 
    } 
} 
-1

要检索_defaults对象内部的对象,您需要改进您的_get函数。

例如,您可以将一个字符串数组(每个字符串表示一个私有名称)传递给_get以允许访问深度嵌套的对象。

+0

la spariamo a casaccio? – lelloman

1

我怀疑你不会总是有一个一级嵌套的对象来访问,所以更简单的方法是使用一个函数来遍历一个基于字符串路径的对象。 Here的编码为Underscore的混合编码。然后你可以使用它像这样:

_.deep(plugin._defaults, 'obj1.someVal'); 

This thread也有一些非下划线的替代品。

+1

我最终写了自己的功能,但谢谢你;你的答案非常有用。 – Klik

+0

太棒了,很高兴你明白了。不要忘记在这里发布您的解决方案。 –

0

传递多个参数,并遍历arguments对象。

function _get(/* name1, name2, namen */) { 
    var item = plugin._optionsObj, 
     defItem = plugin._defaults; 

    for (var i = 0; i < arguments.length; i++) { 
     item = item[arguments[i]]; 
     defItem = defItem[arguments[i]]; 

     if (item == null || defItem == null) 
      break; 
    } 
    return item == null ? defItem : item; 
} 

var opt = _get("obj1", "someVal") 
相关问题