如何以jQuery方式搜索和操作复杂的JavaScript对象

在Web应用程序的上下文中,我有一个服务器,它根据客户端的输入发送或接收JSON字符串。 在客户端使用时,这些JSON字符串会立即转换为JavaScript对象,在这些对象中,它们将作为对象活出来。 这些对象不是数组; 它们代表复杂的,任意的数据模型,其每个属性可以具有任意数量的唯一子属性或对象。

var myView = { name: 'root' id: 'root_0' children: { child_1: { arbitraryid: 'root_0_child_1', type: 'Department', name: 'Produce', quadrant: 1, children: { child_1: { arbitraryid: 'root_0_child_1_child_1', type: 'Aisle', number: 3, length: 12, children: { } } } }, child_2: { arbitraryid: 'root_0_child_2', name: 'West', type: 'Region', children: { child_1: { arbitraryid: 'root_0_child_2_child_1', name: 'Wegmans', type: 'Store', children: { child_1: { arbitraryid: 'root_0_child_2_child_1_child_1', type: 'Department', children: { } } } } } } } }; 

当我构建JSON字符串服务器端时,我保证所有对象都具有’children’和’arbitraryid’属性; 但其他一切都是动态生成的,属性和值完全是任意的。

如果这是XML,我可以使用jQuery来var someChild = myView.find('#root_0_child_1_child_1') 。 这将得到一个jQuery对象,其中包含find的结果, 不仅是对myView的引用,而且是一个全方位地通过对象移动的位置var someChild = myView.find('#root_0_child_1_child_1').parent()

是否存在用于解决本机JavaScript对象的此问题的实用程序,或者是否有更好的方法/方法来执行此操作? 我想避免编写一堆这种类型的代码来简单地获取我的属性然后再次循环以更新父对象。

 while (obj.hasOwnProperty('children')) { for (var child in obj) { //..etc, etc } } 

我在这个主题上看到的大多数SO问题涉及搜索数组 , 通常具有可预测的数据表格式构造 。

映射是可能的,但是这些对象很快变得很深,而且这个选项似乎比哑循环更好。

想法?

编辑:滚动我自己的实用工具类。

我还在探索其他库/实用程序,但是我编写了一个通用帮助程序类来进行搜索:

ObjectHelper

虽然有用,但我认为它说明了获得其他类似jQueryfunction的一些困难。 我不仅想要搜索,而且我希望能够像对象链接.parent()。children()。find()操作符一样向上/向下爬行对象属性结构。 可行但复杂。

我找到了一些JSON查询语言:

  • JSONPath
  • JAQL
  • LINQ to Javascript
  • JSINQ
  • JLINQ
  • SQLike (尽管名称,它用于查询JSON)
  • TrimQuery (使用类似SQL的语言来查询JSON对象)

这个页面对它们进行了总结,并总结了它们的优缺点。

还有一个用于查询JSON的DOJO模块:

  • JSONQuery

我不确定这些是多么稳定/标准。

我通过滚动我自己的课来解决这个问题。 ShadesJS现在非常基础,但它有一些方法可以抓取JavaScript对象并使用Web存储。 在待办事项上实现父/子方法以获得一些JQuery特有的灵活性。 这并不难,但要使它正确且高效,这很棘手。