在不使用eval()的情况下访问连接的属性名称

时间:2013-06-25 18:26:34

标签: javascript jquery performance

我想弄清楚如何在for循环中连接一个对象; eval()工作正常,但我希望最佳效率,我在Google上搜索的大部分内容让我相信eval()不是一个安全的选择。我查看了与eval()相关的其他示例,但是,似乎没有相同的情况。

我是Javascript的初学者,如果这有一个简单的解决方案,请道歉。

objFunction: function () {
        var concat1;
        var concat2;
        $('table tbody tr').each(function (i) {
            i++;
            for (var x = 1; x <= 4; x++) {                   
                concat1 = 'obj1.obj2.obj3.step' + i + '[' + x + ']' + '.name';
                concat2 = 'obj1.obj2.obj3.step' + i + '[' + x + ']' + '.icon';

                console.log(eval(concat1));
                console.log(eval(concat2));
});
}

谢谢,

3 个答案:

答案 0 :(得分:2)

好吧,你已经在使用bracket notation member operator了。只需将它用于stepN

function () {
    $('table tbody tr').each(function (i) {
        i++;
        for (var x = 1; x <= 4; x++) {
            console.log(obj1.obj2.obj3['step'+i][x].name);
            console.log(obj1.obj2.obj3['step'+i][x].icon);
        } // <-- you're missing this brace, btw
    });
}

答案 1 :(得分:1)

而不是:

concat1 = 'obj1.obj2.obj3.step' + i + '[' + x + ']' + '.name';
concat2 = 'obj1.obj2.obj3.step' + i + '[' + x + ']' + '.icon';
console.log(eval(concat1));
console.log(eval(concat2));

您可以使用:

console.log(obj1.obj2.obj3['step' + i][x].name);
console.log(obj1.obj2.obj3['step' + i][x].icon);

这会产生同样的效果。 obj1.obj2obj1['obj2']相同。这只是一个不同的符号。

此外,您的for似乎错过了结束大括号(})。

答案 2 :(得分:0)

这不符合您的要求吗?

objFunction: function () {
    var concat1;
    var concat2;
    $('table tbody tr').each(function (i) {
        i++;
        for (var x = 1; x <= 4; x++) {                   
            console.log(obj1.obj2.obj3['step' + i][x].name);
            console.log(obj1.obj2.obj3['step' + i][x].icon);
    });
}

我没有对此进行测试,但它应该非常接近您的要求。尝试尝试一下语法并将嵌套的部分拆分成分配给其他变量的子表达式,以确定它出错的地方,如果它不能正常工作。