切换嵌套的布尔对象属性(在任意深度) - 可能没有eval?

时间:2013-07-29 18:51:11

标签: javascript eval

考虑以下代码:

var a = {
    b: {
        c: true
    },
    d: {
        e: false
    }
};

function toggle() {
    var prop='';
    for (var i = 0; i<arguments.length; i++) {
        prop += '.' + arguments[i];
    }
    eval('a'+prop+"=!a"+prop);
}

toggle('b', 'c');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('d', 'e');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('b', 'c');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('d', 'e');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);

调用toggle('b', 'c')toggle('d', 'e')将分别翻转a.b.ca.d.e的布尔值。

在这里使用eval是否有任何不足之处,除了eval是邪恶的(当然,这不是:))?

如果是这样,还有什么选择?

1 个答案:

答案 0 :(得分:3)

您可以使用数组表示法来访问属性,而不是使用点表示法。

function toggle() {
    var obj = a;
    for (var i = 0; i<arguments.length-1; i++) {
        obj = obj[arguments[i]];
    }
    obj[arguments[i]] = !obj[arguments[i]];
}