Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JSON中存储树结构_Javascript_Json_Tree - Fatal编程技术网

Javascript 在JSON中存储树结构

Javascript 在JSON中存储树结构,javascript,json,tree,Javascript,Json,Tree,我正在尝试编写一个系统,其中客户端(基于浏览器)请求从服务器返回一个树(appengine,但这与此无关)。问题在于将树转换为JSON:因为每个对象都引用它“下面”的对象,所以当字符串化时,我会得到一个非常长的字符串,在解析时,它会为每个子节点创建新对象,而不是引用其他节点 我目前的解决方案是编写一个“equalTo”和“toString”函数(将对象引用转换为字符串),将结果数组字符串化,然后通过将字符串解析为对象在客户端重新创建它。这个解决方案让我糟糕的算法感觉刺痛,不过,一定有更好的方法通

我正在尝试编写一个系统,其中客户端(基于浏览器)请求从服务器返回一个树(appengine,但这与此无关)。问题在于将树转换为JSON:因为每个对象都引用它“下面”的对象,所以当字符串化时,我会得到一个非常长的字符串,在解析时,它会为每个子节点创建新对象,而不是引用其他节点

我目前的解决方案是编写一个“equalTo”和“toString”函数(将对象引用转换为字符串),将结果数组字符串化,然后通过将字符串解析为对象在客户端重新创建它。这个解决方案让我糟糕的算法感觉刺痛,不过,一定有更好的方法通过JSON返回这样的结构

编辑:我刚刚想到对象引用也可以转换为数组索引。这是一个更好的解决方案,但仍然有这种琐碎的糟糕代码的感觉

EDIT2:好吧,那么我想应该有一些伪代码

var node = {
    children : null;
};

var root = Object.create(node);

var level1a = Object.create(node);
var level1b = Object.create(node);
var level2a = Object.create(node);
var level2b = Object.create(node);

root.children = [level1a, level1b];
level1a.children = [level2a, level2b];
最后你会看到一棵像这样的树:

如果您有一种寻址节点的方法,那么可以使用JSON在地址和引用之间进行转换

例如,如果有两个函数,如

function addressForNode(node) { ... }

function nodeForAddress(address) { ... }
您可以使用在解析或字符串化时调用这些的恢复器和替换器

var jsonString = JSON.stringify(tree, function (key, value) {
  if (typeof value === 'object') {
    var address = addressForNode(value);
    if (address !== null) {  // value really is a node
      return { address: address }
    }
  }
  return value;
});

// And to parse...
var tree = JSON.parse(jsonString, function (key, value) {
  if (typeof value === 'object' && typeof value.address === 'string') {
    return nodeForAddress(value.address);
  }
  return value;
});

如果你能帮上忙,不要局限于JSON。相反,考虑使用JSONP技术生成通过链接脚本所包含的JavaScript代码,必要时通过JSON传递对象将克隆它们。你期望发生什么?JavaScript已经有了一个toString方法:@Neil坦白地说,我期望这会发生,但我希望有一个惊喜:D。我想我有点乐观。@WillPeavy不幸的是,toString方法只是以字符串的形式返回对象;我要找的是一个唯一的标识符,我可以用它把引用连接到对象上。我不清楚你想做什么。您正在尝试将JSON映射到DOM吗?