JS 字符串转 对象的问题

微信小程序有个功能需求要把 字符串转对象,之前用 eval 方法可以很快实现
大概过程是这样:

    var name = 'bb[0]'; //name 是变量,这里假设它值是'bb[0]',也可能传过来的值是'aa[0] 或 bb[1]'
    var data = {"aa":["111","222"],"bb":["333","444"]}; //data的值是固定的
    var newData = eval('data.'+name); //方法 1
    //console.log(newData)  结果是333
    var jsonStr = JSON.stringify(data);
    var newData = (new Function("var temp = " + jsonStr + ';return temp.'+ name))();//方法2
    //console.log(newData)  结果是333

后面发现小程序更新后,禁掉的原有js功能:new Function、eval、Generator。 也就是说之前的方法都不能用了。
求问 除了上面的2个, 还有什么方法能让newData 获得正确的结果()。

阅读 4.1k
6 个回答

难道不应该是 lodash 的 _.at ?不用造轮子,lodash 现成的给你用。

var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
 
_.at(object, ['a[0].b.c', 'a[1]']);
// => [3, 4]

猛戳官方文档 _.at

你可以这么写
var name = 'bb[0]';====> 通过正则转换成 var test = ['bb', '0']

然后 newData = data[test[0]].test[1]

function trans(data, name) {
    let reg = /\[?[^\[\]]+\]?/g
    let reg2 = /\]/
    let names = name.match(reg)
    if (names.length) {
        names = names.map(item => reg2.test(item) ? item.slice(1, -1) : item)
        return names.reduce((sum, cur) => sum[cur], data)
    }
}

var data = {"aa":["111","222"],"bb":["333","444"]};
var name = 'bb[0]';
trans(data, name)
var data = {"aa":["111","222"],"bb":["333","444"]};
name = 'bb[0]';


function getNewData(data, name){
    var prefix = name.split('[')[0],
        endStr = name.split('[')[1];
    var index = endStr.split(']')[0];
    return data[prefix][index];
}

var newName =  getNewData(data, name);
console.log(newName); // 333

'

data['bb']['0']

正则匹配一下就行了

        function aaa(json,str){
                var b =  str.replace(/(\S)\[([0-9]+)\]/,'$1,$2').split(',');
                return json[b[0]][b[1]];
            }
            var newData = aaa(data,name); 
            console.log(newData);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题