我正在寻找一种方法来引用一个对象,基于一个带有它名字的变量。 我知道我可以为属性和子属性执行此操作:
var req = {body: {jobID: 12}};
console.log(req.body.jobID); //12
var subProperty = "jobID";
console.log(req.body[subProperty ]); //12
var property = "body";
console.log(req[property][subProperty]); //12
对象本身是否可能?
var req = {body: {jobID: 12}};
var object = "req";
var property = "body";
var subProperty = "jobID";
console.log([object][property][subProperty]); //12
or
console.log(this[object][property][subProperty]); //12
注意:我在node.js中这样做而不是浏览器。
这是函数的一个施加:
if(action.render){
res.render(action.render,renderData);
}else if(action.redirect){
if(action.redirect.args){
var args = action.redirect.args;
res.redirect(action.redirect.path+req[args[0]][args[1]]);
}else{
res.redirect(action.redirect.path);
}
}
我可以通过改变它来解决这个问题,但我一直在寻找更有活力的东西。
if(action.render){
res.render(action.render,renderData);
}else if(action.redirect){
if(action.redirect.args){
var args = action.redirect.args;
if(args[0]==="req"){
res.redirect(action.redirect.path+req[args[1]][args[2]]);
}else if(args[0]==="rows"){
rows.redirect(action.redirect.path+rows[args[1]][args[2]]);
}
}else{
res.redirect(action.redirect.path);
}
}
答案 0 :(得分:0)
通常,不可能通过名称引用对象。但是因为你只有两个候选人......
var args, redirect_path = '';
if(args = action.redirect.args) {
try {
redirect_path = ({req:req,rows:rows})[args[0]][args[1]][args[2]];
} catch (_error) {}
}
res.redirect(action.redirect.path + (redirect_path || ''));
我使用内联对象{req:req,rows:rows}
作为字典来查找args[0]
值。
我用try ... catch
包裹了整个结构,因为它很危险。例如,将'req'
或'rows'
以外的任何内容作为args[0]
传递将导致抛出异常。
我还将res.redirect
移到if
之外以澄清代码。
也可以使用任意长度的args
数组。但要这样做,您需要循环遍历args
数组:
var branch, redirect_path;
if (action.redirect.args) {
try {
branch = { req: req, rows: rows }
action.redirect.args.forEach(function(key) {
branch = branch[key];
});
if ('string' === typeof branch) {
redirect_path = branch;
}
} catch (_error) {}
}
res.redirect(action.redirect.path + (redirect_path || ''));
添加'string' === typeof branch
检查以确保结果值是字符串。