将带有点表示法的字符串转换为JSON

时间:2014-04-10 10:40:34

标签: javascript object

给定一个字符串作为点表示法,如何从该字符串创建一个对象(检查已存在的属性):例如

var obj = {};
stringToObj('a.b', 'value1', obj);
stringToObj('a.b.c', 'value2', obj);

会产生

{
   "a": {
    "b": {
        "_x": "value1",
        "c": {
            "_x": "value2"
        }
    }
    }
 }

我看过this questionthis one,但似乎对我正在做的事情都不够。

有什么想法?

3 个答案:

答案 0 :(得分:14)

对于那些在对象中没有_x的情况下寻找解决方案的人,请尝试使用此代码。稍微修改上面的代码(很棒)

stringToObj = function(path,value,obj) {
  var parts = path.split("."), part;
  var last = parts.pop();
  while(part = parts.shift()) {
   if( typeof obj[part] != "object") obj[part] = {};
   obj = obj[part]; // update "pointer"
  }
 obj[last] = value;
}

作为奖励,如果您想要更新现有对象的部分,上述代码将起作用:)

 var obj = {a:{b:3}};
 stringToObj("a.b",10,obj);
 console.log(obj); //result : {a:{b:10}}

答案 1 :(得分:12)

您可以利用参考资料:

function stringToObj(path,value,obj) {
    var parts = path.split("."), part;
    while(part = parts.shift()) {
        if( typeof obj[part] != "object") obj[part] = {};
        obj = obj[part]; // update "pointer"
    }
    obj["_x"] = value;
}

答案 2 :(得分:0)

要扩展@ilikeopensource和@Niet的Dark Absol答案,我需要添加对数组(同一路径的多个实例)的支持,并可能嵌套对象。我的情况更多是点符号和json字符串的混合体。

function stringToObj(path, value, obj) {
    var objValue = value;
    try {
        objValue = JSON.parse(value);
    } catch (e) { } //eat the error, must not be json so carry on... Hack to do a valid JSON check

    var parts = path.split("."), part;
    var last = parts.pop();
    while (part = parts.shift()) {
        if (typeof obj[part] != "object")
            obj[part] = {};
        obj = obj[part];
    }
    if (obj.hasOwnProperty(last) && obj[last] && obj[last].constructor === Array) {
        obj[last].push(objValue);
    }
    else if (obj.hasOwnProperty(last) && obj[last]) {
        var objArray = [];
        objArray.push(obj[last])
        objArray.push(objValue);
        obj[last] = objArray;
    }
    else {
        obj[last] = objValue;
    }
}

谢谢大家的帮助!