我有一个json嵌套对象,类似于this。
在我的情况下,我有一个int类型的唯一id
字段(比如上面的name
)。这不是二叉树,而是更多描绘父子关系。我想要一种方法来轻松查找以id = 121
为根的子树(孩子)。以蛮力的方式,我可以比较所有节点,直到找到一个,并返回孩子。但我想到保留{id,node}的地图。例如{"121" : root[1][10]..[1]}
。这可能是内存的极度浪费(除非使用指向数组的指针)。请注意更好的方法。
我可以控制从服务器发送什么,因此可能会增加以上数据结构。但需要一种快速的方法来获取基于客户端节点ID的子树。
编辑: 我正在考虑保留另一个数据结构,{id,[] ids}的映射,其中id是从root开始的有序路径。有更好的方法吗?
答案 0 :(得分:1)
javascript中的对象是真正的基于指针的对象,这意味着您可以在不使用更多内存的情况下保留对它们的多个引用。为什么不进行单次遍历将子对象分配给新的基于id的父对象?除非您的分层对象非常庞大,否则这应该非常快。
根据最佳实践以及如果您正在构建的应用程序扩展到数百万用户会发生什么,您可能会重新考虑您是否真的希望服务器执行更多工作。客户端的计算机就坐在那里,准备免费为您提供远程计算能力。为什么要将工作负载移到服务器上,导致它每秒处理更少的客户端请求?这可能不是你想要的方向。
Here is a fiddle demonstrating this index-building technique。您可以浏览一次,并根据需要反复使用索引。构建所述索引只需要4或5毫秒。没有性能问题!
还有一点需要注意:如果你关心bandwith,一个简单的方法就是减少你的JSON。不要在对象键名称周围加上引号,使用单字母键名,不要使用空格和换行符。这将为您带来非常大的改进。对您的示例JSON执行此更改,它从11,792个字符变为5,770个字符,仅为原始大小的49%!
一个小注意事项是javascript中的对象键始终是字符串。我添加到示例JSON中的数字ID在用作键名时被强制转换为字符串。这应该不会妨碍使用,但这是一个您可能想要了解的细微差别。
答案 1 :(得分:0)
我不认为id是以某种方式排序的,但是如果你向每个节点添加关于最小和最大id 值的信息,它仍然可能有助于修剪树的至少部分其子女(以及子女)。
在服务器端可以很容易地实现这一点,在搜索树时,您可以在进入并搜索所有子项之前检查您要查找的ID是否在节点的id范围内。