【问题标题】:How to convert a string that formatted as array variable into javascript object?如何将格式化为数组变量的字符串转换为 javascript 对象?
【发布时间】:2016-04-13 13:34:20
【问题描述】:

我有一个 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。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 不确定 1 是否可以是 js 对象中的键,尽管 '1' 可以:stackoverflow.com/questions/3633362/…
  • 你说得对,我的意思是 config['b']['1'] = 9
  • 我尝试解析它并从解析的部分创建对象,但感觉会有更好的方法。
  • @errata 当然可以,首先会转换为字符串,然后变成“1”。

标签: javascript jquery lodash


【解决方案1】:

您可以使用 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);

【讨论】:

  • 也许一些解释连同代码会有用。
  • 我认为这段代码有一个错误,如果添加 config['b[2]'] = 8 到它。它不会被转换。我的错,因为我没有在问题中添加多个 b 元素。
【解决方案2】:

JS 没有执行此操作的内置功能。 但是你可以使用一些辅助方法。

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);

小心你的字符串,解析器非常基础 它假定输入字符串是有效的。

【讨论】:

    【解决方案3】:

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

    var obj = {
        some: {
            string: {
                location: 2
            }
        }
    };
    
    console.log(getDataFromObj(obj, "some.string['location']"));
    

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

    【讨论】:

      猜你喜欢
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2018-09-25
      • 2016-10-09
      • 2023-02-06
      相关资源
      最近更新 更多