如果我有一个JavaScript对象,例如:
var x = {foo: 42, bar: {fubar: true}}
然后我可以使用true
获取值var flag = x.bar.fubar
。我希望能够分离并存储路径"bar.fubar"
,然后动态评估它。类似的东西:
var paths = ["bar.fubar", ...];
...
var flag = evalPath( x, paths[0] );
显然,我可以为基本路径表达式语法编写一个简单的解析器和求值器。但是根据DRY原则,我想知道是否已经有一种现有的方法可以做一些内置于JavaScript的evalPath
或者一个可以完成这项工作的小型库?我还预计将来在路径表达式中需要数组索引。
更新为了清楚起见,我不是要求代码示例 - 我的问题是我是否可以重复使用现有代码(内置或库)。感谢下面的贡献者提供代码示例的建议!请注意,它们都不处理数组索引要求。
答案 0 :(得分:1)
为什么不尝试类似
的内容function evalPath(obj, path)
{
var rtnValue = obj;
// Split our path into an array we can iterate over
var path = path.split(".");
for (var i = 0, max=path.length; i < max; i++)
{
// If setting current path to return value fails, set to null and break
if (typeof (rtnValue = rtnValue[path[i]]) == "undefined")
{
rtnValue = null;
break;
}
}
// Return the final path value, or null if it failed
return rtnValue;
}
未经测试,但应该可以正常使用。与XPath一样,如果无法找到它正在寻找的内容,它将返回null。
答案 1 :(得分:1)
快速搜索,我遇到JSONPath。完全没有使用它,但看起来它可能会按你想要的那样。
使用示例:
var x = {foo: 42, bar: {fubar: true}}
var res1 = jsonPath(x, "$.bar.fubar"); // Array containing fubar's value
答案 2 :(得分:0)
JavaScript提供eval
,但我不推荐它。
答案 3 :(得分:0)
你可以尝试这样的事情。我真的不能想到以这种方式存储路径是合适的情况。
function evalPath(obj, path) {
var pathLevels = path.split('.');
var result = obj;
for (var i = 0; i < pathLevels.length; i++) {
try {
result = result[pathLevels[i]];
}
catch (e) {
alert('Property not found:' + pathLevels[i]);
}
}
return result;
}
alert
实际上仅用于调试目的。您可能想要返回null
或其他内容。
答案 4 :(得分:0)
喜欢
function locate(obj, path) {
var p = path.split("."), a = p.shift();
if(a in obj)
return p.length ? locate(obj[a], p.join(".")) : obj[a];
return undefined;
}
locate(x, "bar.fubar")
这只适用于右边,当然
答案 5 :(得分:0)
怎么样:
evalPath = function(obj, path) {
if (path[0] === "[") {
return eval("obj" + path);
} else {
return eval("obj." + path);
}
};
这样做的好处是它适用于任意字符串:
evalPath([1,2,3],“[0]”); =&GT; 1
evalPath({a:{b:7}},“a.b”); =&GT; 7
当然,这只有在您真正信任您的意见时才有效。