如何将格式为数组变量的字符串转换为JavaScript对象?

3
我有一个以javascript对象定义的变量(这是在我无法控制的其他地方创建的)。
var config = {
    a: 2
}

config['b[1]'] = 9;
config['b[2]'] = 8;
config['c[test]'] = 3;

我希望将它转换为类似以下的形式(对于键1,我指的是config['b']['1'] = 9)。
var transformed = {
    a: 2,
    b: { 1: 9, 2: 8},
    c: { test: 3}
}

我怎样才能轻松地做到这一点?如果有帮助,我会使用lodash。

你到目前为止尝试了什么? - Jeremy Thille
虽然'1'可以,但不确定数字1是否可以作为JS对象中的键:https://dev59.com/DnA65IYBdhLWcg3wyR2k - errata
你是对的,我的意思是 config['b']['1'] = 9。 - jay.m
我尝试解析它并从解析的部分创建对象,但感觉会有更好的方法。 - jay.m
当然可以,它将首先被转换为字符串,并变为“1”。 - dfsq
对象与数组相同,而数组可以具有数字键。 - neaumusic
3个回答

4
你可以使用for()循环来遍历对象的键并使用match函数来获取必要的新键。 希望这有所帮助。
var config = {
  a: 2
};

config['b[1]'] = 9;
config['c[test]'] = 3;

var key, match, obj;

for(key in config) {
  match = key.match(/(.+)\[(.+)\]/);
  if(match) { // for example key is 'b[1]'
    obj = config[match[1]] || {}; // <= Update create new object or use filled
    obj[match[2]] = config[key]; // add new property (match[2] => '1') to new object
    config[match[1]] = obj; // add new property (match[1] => 'b') to config
    delete config[key]; // remove composite key
  }
}
console.dir(config);

或许对这段代码进行一些解释会更有用。 - Anton
我认为这段代码有一个错误,如果添加config['b[2]'] = 8,它将不会被转换。这是我的错,因为我在问题中没有添加多个b元素。 - jay.m

1

JavaScript没有内置的功能来实现这个。
但是你可以使用一个小助手方法。

function setProp(obj, prop, value){
    var s = String(prop), 
        a = s.replace("[", "][").split("]["),
        last = a.length - 1,
        p, q;

    if(last && s.substr(-1) === "]"){
        p = a[last];
        a[last] = p.substr(0, p.length-1);
    }

    for(var i=0, me = obj; i<last; ++i){
        var p = a[i];

        //check if property is not a primiive or undefined
        var hasProp = p in me && me[p] === Object(me[p]);
        if(!hasProp){ //create a object for it
            q = a[i+1];
            //use an Array for numeric indices
            me[p] = (q === (+q).toString())? []: {};

            //always use Objects
            //me[p] = {};
        }
        me = me[p];
    }

    me[a[last]] = value;
}

var config = { a: 2 };

setProp(config, 'b[1]', 9);
setProp(config, 'b[2]', 8);
setProp(config, 'c[test]', 3);

在处理字符串时要小心,解析器非常基础,它假设输入的字符串是有效的。


0

不确定与 eval 相比这个的性能如何,但它应该适用于大多数情况

var obj = {
    some: {
        string: {
            location: 2
        }
    }
};

console.log(getDataFromObj(obj, "some.string['location']"));

function getDataFromObj (obj, key) {
    return new Function("return obj." + key)()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接