Javascript 基于变量引用对象';里面有谁的名字

Javascript 基于变量引用对象';里面有谁的名字,javascript,node.js,Javascript,Node.js,我正在寻找一种方法来引用一个对象,基于一个包含其名称的变量。 我知道我可以为属性和子属性执行此操作: 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

我正在寻找一种方法来引用一个对象,基于一个包含其名称的变量。 我知道我可以为属性和子属性执行此操作:

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);
            }
        }

通常情况下,不可能通过名称引用对象。但既然你只有两个可能的候选人

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来包装整个结构。。。抓住
,因为这很危险。例如,将
'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
检查以确保结果值是字符串。

Nop,这看起来肯定像是XY问题。想象一下这样的后果,比如PHPs
$$var
,呃。而且,
window[object]
并不是一个解决方案,有人可能会这么说。你为什么要这样做?憎恨者会讨厌:
eval(object+'.+property+'.+subperty)
@Johan这就是答案。为什么不把它放在答案里呢?该死的,我正在写一个web应用程序,有时我需要重定向到另一个页面。例如,在他们完成编辑作业后,我将他们重定向到查看作业页面。问题是当重定向时,它们通常需要某种ID,通常来自req.body或req.params,因此我有一个跟踪属性/子属性的对象。但对于创建新工作的页面,它需要来自行。insertid@z5h我想让他回答Enclars的问题,因为这很可能是一个XY问题,如前所述。很好,我很喜欢,你有没有一个简单的方法来调整它,以便它能够适应args的长度变化?或者,是否有办法输入空白/空/未定义的第三个参数?例如req.body.jobID,但不包括行。insertID@Leonid,谢谢,太好了!