我有一个json嵌套对象,类似于this。
在我的例子中,我有一个惟一的int类型的id
字段(比如上面的name
)。这不是一棵二叉树,而是更能刻画父子关系。我想找到一种简单的方法来查找扎根于sayid = 121
的子树(children)。以暴力的方式,我可以比较所有节点,直到找到一个,然后返回孩子们。但我想保留{id,node}的映射。例如{"121" : root[1][10]..[1]}
这可能是超级浪费内存(除非使用指向数组的指针)。请注意任何更好的方法。
我可以控制从服务器发送什么,所以可以扩展上面的数据结构但是需要一种快速的方法来获得基于客户端节点id的子树。
编辑:
我正在考虑保留另一个数据结构,映射{id,[]ids},其中ids是根的有序路径有更好的办法吗?
最佳答案
javascript中的对象是真正的基于指针的对象,这意味着您可以在不使用更多内存的情况下保留对它们的多个引用。为什么不进行一次遍历,将子对象分配给一个新的基于id的父对象?除非您的层次对象非常庞大,否则应该非常快。
根据最佳实践以及如果您正在构建的应用程序扩展到数百万用户会发生什么,您可能会重新考虑是否真的希望服务器做更多的工作客户机就在那里,随时可以免费为您提供远程计算能力。为什么要将工作负载移动到服务器,使其每秒处理更少的客户端请求这可能不是你想走的方向。
Here is a fiddle demonstrating this index-building technique。你只需浏览一次,就可以随心所欲地反复使用索引。只需4或5毫秒即可建立上述指数。没有性能问题!
另一个注意事项:如果您关心bandwith,一个简单的方法就是精简json。不要在对象键名称周围加引号,使用单字母键名称,不要使用空格和换行符这会给你带来很大的进步。对示例JSON执行此更改时,它从11792个字符变为5770个字符,只有原始大小的49%!
一个小问题是javascript中的对象键总是字符串。我添加到示例json中的数字id在用作键名时被强制为字符串。这不应该妨碍使用,但这是一个微妙的区别,你可能想知道。