如何像使用jQuery一样搜索和操作复杂的JavaScript对象

4
在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()

是否存在解决原生JavaScript对象这个问题的实用程序,或者是否有更好的方法/方法论来解决这个问题?我希望避免编写大量此类代码,以便简单地获取我的属性,然后可能再次循环以更新父对象。

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

我看到大部分关于这个问题的SO问题都涉及搜索数组经常是可预测的数据表格样式构建

映射是可能的,但这些对象很快就会变得深层,这个选项似乎比愚蠢的循环好不了多少。

有什么想法吗?

编辑:自己编写实用程序类。

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

ObjectHelper

虽然有用,但我认为它展示了访问其他类似jQuery功能的困难之处。我不仅想搜索,还想能够沿着对象属性结构向上/向下爬行,类似于您可以将.parent().children().find()操作符链接在一起的方式。可行,但复杂。

2个回答

2

是的,就像这些工具一样。我查看了JS中实现的各种LINQ和JSONPath。JAQL似乎采取了相同的方法。这些工具的问题在于,我没有使用数组,也没有使用字符串(因此不使用JSON)。我正在处理无法与表结构很好地映射(甚至根本不能映射)的对象。大多数工具都假定您要么拥有具有可预测“行”的数组,要么拥有实际的JSON(据我所知)。 - Christopher
@Christopher,这很有道理。您想能够查询任意对象。 - Vivin Paliath
JSONQuery看起来很有前途。我无法在jsfiddle上测试它,因为Dojo似乎没有在任何CDN内容中包含dojox模块。现在正在下载并进行本地测试。 - Christopher
1
使用JSONQuery,我找不到嵌套属性。继续寻找。谢谢提示。 - Christopher

0

我通过编写自己的类来解决了这个问题。ShadesJS现在还比较基础,但它有一些方法可以爬取JavaScript对象并处理Web存储。在待办事项中是实现父/子方法以获得一些类似于JQuery的灵活性。这并不难做到,但要做到正确和高效却很棘手。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接