将复杂的 JavaScript 对象转换为点符号对象

新手上路,请多包涵

我有一个像

{ "status": "success", "auth": { "code": "23123213", "name": "qwerty asdfgh" } }

我想将其转换为点符号(一级)版本,例如:

 { "status": "success", "auth.code": "23123213", "auth.name": "qwerty asdfgh" }

目前我正在使用字段手动转换对象,但我认为应该有更好、更通用的方法来执行此操作。有没有?

注意:有一些示例显示相反的方法,但我找不到确切的方法。

注意 2:我希望它与我的服务器端控制器操作绑定一起使用。

原文由 vardars 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 240
2 个回答

您可以递归地将属性添加到新对象,然后转换为 JSON:

 var res = {};
(function recurse(obj, current) {
  for(var key in obj) {
    var value = obj[key];
    var newKey = (current ? current + "." + key : key);  // joined key with dot
    if(value && typeof value === "object") {
      recurse(value, newKey);  // it's a nested object, so do it again
    } else {
      res[newKey] = value;  // it's not an object, so set the property
    }
  }
})(obj);
var result = JSON.stringify(res);  // convert result to JSON

原文由 pimvdb 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是针对第一个前缀获得 undefined 时的修复/破解。 (我做了)

 var dotize = dotize || {};

dotize.parse = function(jsonobj, prefix) {
  var newobj = {};
  function recurse(o, p) {
    for (var f in o)
    {
      var pre = (p === undefined ? '' : p + ".");
      if (o[f] && typeof o[f] === "object"){
        newobj = recurse(o[f], pre + f);
      } else {
        newobj[pre + f] = o[f];
      }
    }
    return newobj;
  }
  return recurse(jsonobj, prefix);
};

原文由 rhalff 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题