将复杂的JavaScript对象转换为点表示法对象

var*_*ars 9 javascript syntax

我有一个像这样的对象

{ "status": "success", "auth": { "code": "23123213", "name": "qwerty asdfgh" } }
Run Code Online (Sandbox Code Playgroud)

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

{ "status": "success", "auth.code": "23123213", "auth.name": "qwerty asdfgh" }
Run Code Online (Sandbox Code Playgroud)

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

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

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

pim*_*vdb 28

您可以递归地将属性添加到新对象,然后转换为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
Run Code Online (Sandbox Code Playgroud)


Gui*_*lem 8

您可以使用 NPM点对象( Github ) 进行对象到点表示法的转换,反之亦然。

var dot = require('dot-object'); 
var obj = {
  id: 'my-id',
  nes: { ted: { value: true } },
  other: { nested: { stuff: 5 } },
  some: { array: ['A', 'B'] }
};

var tgt = dot.dot(obj);
Run Code Online (Sandbox Code Playgroud)

生产

{
  "id": "my-id",
  "nes.ted.value": true,
  "other.nested.stuff": 5,
  "some.array[0]": "A",
  "some.array[1]": "B"
}
Run Code Online (Sandbox Code Playgroud)


小智 5

当你获得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);
};
Run Code Online (Sandbox Code Playgroud)