如何从Javascript中的参数访问对象中的对象?

时间:2013-02-02 23:28:46

标签: javascript oop object syntax

  

可能重复:
  Accessing nested JavaScript objects with string key

我有功能

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'传递给参数,但它没有用。想法?

编辑:我找到了一个解决方案,我在下面发布了它作为答案。我写了一个非常好的小函数,用字符串来完成嵌套值,并且我不需要更改我的函数来实现它。我希望这可以帮助处于类似情况的任何人。

4 个答案:

答案 0 :(得分:1)

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

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

This thread也有一些非Underscore替代品。

答案 1 :(得分: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")

答案 2 :(得分: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];
    }
}

答案 3 :(得分:-1)

要检索_defaults对象内的对象,您需要改进 _get 功能。

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