鉴于以下obj:
var inputMapping = {
nonNestedItem: "someItem here",
sections: {
general: "Some general section information"
}
};
我正在通过传入字符串get
或嵌套的案例"nonNestedItem"
向"sections.general"
数据写一个函数。我不得不使用eval
和我想知道是否有更好的方法可以做到这一点。
这是我到目前为止所做的一切,并且工作正常。但要改进!
function getNode(name) {
var n = name.split(".");
if (n.length === 1) {
n = name[0];
} else {
var isValid = true,
evalStr = 'inputMapping';
for (var i=0;i<n.length;i++) {
evalStr += '["'+ n[i] +'"]';
if (eval(evalStr) === undefined) {
isValid = false;
break;
}
}
if (isValid) {
// Do something like return the value
}
}
}
答案 0 :(得分:5)
您可以使用Array.prototype.reduce
这样的功能
var accessString = "sections.general";
console.log(accessString.split(".").reduce(function(previous, current) {
return previous[current];
}, inputMapping));
<强>输出强>
Some general section information
如果您的环境不支持reduce
,则可以使用此递归版
function getNestedItem(currentObject, listOfKeys) {
if (listOfKeys.length === 0 || !currentObject) {
return currentObject;
}
return getNestedItem(currentObject[listOfKeys[0]], listOfKeys.slice(1));
}
console.log(getNestedItem(inputMapping, "sections.general".split(".")));
答案 1 :(得分:2)
您不需要在此处使用eval()
。您可以使用[]
从对象中获取值。使用临时对象保存当前值,然后在每次需要下一个键时更新它。
function getNode(mapping, name) {
var n = name.split(".");
if (n.length === 1) {
return mapping[name];
} else {
var tmp = mapping;
for (var i = 0; i < n.length; i++) {
tmp = tmp[n[i]];
}
return tmp;
}
}