在 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 对象,其中包含查找的结果,不仅是对 myView 的引用,而且是一个位置,从该位置可以全向移动通过对象:var someChild = myView.find('#root_0_child_1_child_1').parent()
.
是否存在一个实用程序来解决 native JavaScript 对象的这个问题,或者是否有更好的方法/方法来解决这个问题?我想避免编写一堆这种类型的代码来简单地获取我的属性,然后可能再次循环以更新父对象。
while (obj.hasOwnProperty('children')) {
for (var child in obj) {
//..etc, etc
}
}
我在这个主题上看到的大多数 SO 问题都是 with searching arrays , frequently with predictable data table style construction .
映射是可能的,但这些对象很快就会变得很深,而且这个选项似乎比哑循环好不了多少。
想法?
编辑:滚动我自己的实用程序类。
我仍在探索其他库/实用程序,但我编写了一个通用帮助程序类来进行搜索:
虽然有用,但我认为它说明了获得其他类似 jQuery 的功能的一些困难。我不仅想要搜索,而且还希望能够向上/向下爬行对象属性结构,类似于将 .parent().children().find() 运算符链接在一起的方式。可行,但复杂。
最佳答案
我发现了一些 JSON 查询语言:
- JSONPath
- JAQL
- LINQ to Javascript
- JSINQ
- jLinq
- SQLike (尽管名称,它用于查询 JSON)
- TrimQuery (使用类似SQL的语言查询JSON对象)
This page总结它们并分析它们的优缺点。
还有一个用于查询 JSON 的 DOJO 模块:
不过我不确定它们有多稳定/标准。
关于javascript - 如何以 jQuery 方式搜索和操作复杂的 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094563/