我有功能
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 :(得分: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 ,以允许访问深层嵌套的对象。