1

我有一个 json 嵌套对象,类似于this

在我的例子中,我有一个idint 类型的唯一字段(比如name上面说的)。这不是二叉树,而是更刻画父子关系。我想要一种方法来轻松查找植根于 say 的子树(孩子)id = 121。以蛮力的方式,我可以比较所有节点,直到找到一个,然后返回子节点。但我想保留一张 {id, node} 的地图。例如{"121" : root[1][10]..[1]}. 这可能是对内存的超级浪费(除非使用指向数组的指针)。请注意肯定有更好的方法。

我可以控制从服务器发送的内容,因此可以增加上述数据结构。但需要一种快速的方法来根据客户端的节点 ID 获取子树。

编辑:我正在考虑保留另一个数据结构,{id, []ids} 的映射,其中 ids 是从根目录开始的有序路径。有更好的办法吗?

4

2 回答 2

1

javascript 中的对象是真正的基于指针的对象,这意味着您可以保留对它们的多个引用,而无需使用更多内存。为什么不进行一次遍历将子对象分配给新的基于 id 的父对象?除非您的分层对象非常庞大,否则这应该非常快。

根据最佳实践以及如果您正在构建的应用程序扩展到数百万用户会发生什么,您可能会重新考虑是否真的希望服务器完成更多工作。客户的电脑就坐在那里,随时为您免费提供远程计算能力。为什么将工作负载转移到服务器,导致它每秒处理更少的客户端请求?这可能不是你想去的方向。

这是一个演示这种索引构建技术的小提琴。您运行一次,并随心所欲地一遍又一遍地使用索引。建立所述索引只需要 4 或 5 毫秒。没有性能问题!

还有一点需要注意:如果您关心带宽,一种简单的帮助方法是减少您的 JSON。不要在对象键名周围加上引号,使用一个字母的键名,不要使用空格和换行符。这会给你带来很大的进步。对您的示例 JSON 执行此更改,它从 11,792 个字符变为 5,770 个字符,仅为原始大小的 49%!

一个小提示是 javascript 中的对象键始终是字符串。我添加到您的示例 JSON 中的数字 id 在用作键名时被强制转换为字符串。这应该不会妨碍使用,但这是您可能需要注意的细微差别。

于 2012-09-27T17:54:41.090 回答
0

我不认为id是按某种方式排序的,但是如果您向每个节点添加有关其子节点(以及子... )。

这可以很容易地在服务器端实现,在搜索树时,您可以检查您要查找的 id 是否在节点的 id 范围内,然后再进入并搜索所有子节点。

于 2012-09-27T17:15:13.930 回答