引用一个对象,基于一个带有它名称的变量

时间:2014-08-21 21:14:50

标签: 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][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);
            }
        }

1 个答案:

答案 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检查以确保结果值是字符串。