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

15

如果给定一个点符号表示的字符串,我怎样从这个字符串创建一个对象(检查已有的属性):例如

var obj = {};
stringToObj('a.b', 'value1', obj);
stringToObj('a.b.c', 'value2', obj);
{
   "a": {
    "b": {
        "_x": "value1",
        "c": {
            "_x": "value2"
        }
    }
    }
 }
我看了这个问题这个问题,但都不足以满足我的需求。你有什么想法吗?

5
这里没有JSON。 - Niet the Dark Absol
对象/物件..土豆/马铃薯.. - stephen mc
3
更像苹果/橙子。JSON 是一种用 JavaScript 兼容符号表示的字符串,代表一个对象。对象就是...一个对象。 - Niet the Dark Absol
4个回答

20

如果您正在寻找没有对象中的“_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}}

这个解决方案正是我需要的,你帮我节省了数小时的工作时间。谢谢陌生人。 - kukis
问题的绝佳解决方案 - Anshul Sahni

15

你可以利用引用:

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
为了进一步阐述@ilikeopensource和@Niet the 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;
    }
}

感谢大家的帮助!


你能给出你所支持的输入示例吗?例如:“数组支持”。当然,还需要提供预期输出。 - roydukkey

1

这个问题可能已经有很好的答案了,但我想分享一下我的解决方案,希望对那些寻找不同方法的人有所帮助。

如果你想将字符串点表示法转换为字符串JSON,这是我的方法。

function dotToJson({ notation, inclusive = true, value = null }) {
  const fragments = notation.split(".").reverse();

  if (!inclusive) {
    fragments.pop();
  }

  console.log(fragments);

  return fragments.reduce((json, fragment) => {
    if (isNaN(fragment)) {
      return `{ "${fragment}": ${json} }`
    }

    let fill = "";

    if (Number(fragment) > 0) {
      for (let i = 0; i < fragment; i++) {
        fill += "null, "
      }
    }

    return `[${fill}${json}]`;
  }, JSON.stringify(value));
};
属性 含义
notation 点符号字符串
inclusive 包括根片段
value 叶子的默认值

您可以在此处查看结果,我使用 Quokka.js 进行了测试。

最终截图

注意:除此之外,这可能有助于更新对象,因为您可以使用解析后的 JSON 的扩展运算符。


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