1

可能重复:
使用字符串键访问嵌套的 JavaScript 对象

我有这个功能

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

我希望能够在我的 _defaults 对象中包含对象,但是我不知道如何检索它们,但只使用一组方括号。

IE

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

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

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

4

4 回答 4

1

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

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

这个线程也有一些非下划线的替代品。

于 2013-02-02T23:38:44.150 回答
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")
于 2013-02-02T23:48:50.540 回答
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];
    }
}
于 2013-02-03T00:39:03.267 回答
-1

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

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

于 2013-02-02T23:32:54.113 回答