转换模板文字以在没有 eval 的情况下检索对象的值

convert template literal to retrieve object's value without eval

// declared read-only variable:
const support = {
        arr: {
            ins: ['g3', 'g5', 'g7', 'g10',
                'g12', 'g13', 'g14', 'g15'
            ]
        }
    },
// object destructuring for easy to call:
{ arr: { ins: supE1range } } = support;

以及在 supE1range 对象中 sup1 之间动态变化的函数:

function autoSelect(currClass, currElite) {
    let setClass = '';
    switch (currClass) {
        case 'support':
            setClass = 'sup';
            break;
    }
    let setObj = `${setClass}E${currElite}range`;
    console.log(eval(setObj));
}
autoSelect('support', 1);

如您所见,eval(setObj) 将获得 supE1range 的值,因为该字符串与对象名称匹配。

现在如何在没有 eval 的情况下完成它?
我正在搜索相关的 questions/answers 但没有满足我的需求。
嗯..不要介意 'dynamically change' 因为它只是代码的一部分,不需要放在这里

我的建议是不要通过解构创建变量,而是尝试创建一个对象(map 在这种情况下)以使用您指定的键保存值。

然后通过查找 map 对象来检索值。

const map = {};

// declared read-only variable:
const support = {
    arr: { ins: map.supE1range = ['g3', 'g5', 'g7', 'g10', 'g12', 'g13', 'g14', 'g15'] },
};

function autoSelect(currClass, currElite) {
    let setClass = '';
    switch (currClass) {
        case 'support':
            setClass = 'sup';
            break;
    }
    let setObj = `${setClass}E${currElite}range`;
    console.log(map[setObj]);
}
autoSelect('support', 1);


或者您可以使用 var 声明变量,然后使用 window 对象检索值(不推荐)

// declared read-only variable:
var support = {
        arr: {
            ins: ['g3', 'g5', 'g7', 'g10',
                'g12', 'g13', 'g14', 'g15'
            ]
        }
    },
// object destructuring for easy to call:
{ arr: { ins: supE1range } } = support;

function autoSelect(currClass, currElite) {
    let setClass = '';
    switch (currClass) {
        case 'support':
            setClass = 'sup';
            break;
    }
    let setObj = `${setClass}E${currElite}range`;
    console.log(window[setObj]);
}
autoSelect('support', 1);