解决方案
如果您确定 的语法str
正确,则该函数可能如下所示:
function get_by_path(source, path){
var path_elements = path.split(']').join('').split('[');
for (var i=0; i < path_elements.length; i++){
source = source[path_elements[i]];
if (typeof source === 'undefined'){
return null;
}
};
return source;
};
测试
这是它的行为方式:
var data = {'user': {
'username': "AzureDiamond", 'password': "hunter2",
'details': {'address': {'street': "Happiness Street"}}
}};
get_by_path(data, 'user'); // gives user object
get_by_path(data, 'user[username]'); // gives "hunter2"
get_by_path(data, 'user[password]'); // gives "AzureDiamond"
get_by_path(data, 'fake'); // gives null
get_by_path(data, 'user[details][address][street]'); // gives "Happiness Street"
解释
该脚本不使用正则表达式,也不使用危险eval()
的调用,只假设您的“路径”将以一个不带括号的单词开头,并且每个下一部分(如果有)将是括在方括号中的单词。如果在遍历的对象中找不到某些路径,null
则将返回。如果它被找到,它将被返回(不管它是一些复杂的对象、字符串null
、、布尔值还是其他任何东西)。
脚本从解析您的路径开始。它通过删除右方括号 (" ]
") 并通过打开方括号 (" [
") 拆分结果字符串来做到这一点。该过程如下所示:
"user" -> "user" -> ["user"]
"user[username]" -> "user[username" -> ["user", "username"]
"user[password]" -> "user[password" -> ["user", "password"]
"user[address][street]" -> "user[address[street" -> ["user", "address", "street"]
"fake" -> "fake" -> ["fake"]
因此,如您所见,最后您有一个路径元素数组。这些被一一评估。如果在任何级别上都无法对数据参数的结构进行更深入的适当步骤,则null
返回。否则返回最后访问的元素。
证明
它有效的证明在这里:http: //jsfiddle.net/EJCgE/2/
编辑replace()
:由于字符串方法的工作原理,更复杂的路径(当有两个以上级别时)存在一些问题。我已更新我的代码以不包含 jQuery 并修复该问题。
EDIT2:我已更新脚本以删除冗余行和一个冗余变量。