Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS动态对象内对象内对象内对象。。。穿越_Javascript_Jquery_Javascript Objects_Nested - Fatal编程技术网

Javascript JS动态对象内对象内对象内对象。。。穿越

Javascript JS动态对象内对象内对象内对象。。。穿越,javascript,jquery,javascript-objects,nested,Javascript,Jquery,Javascript Objects,Nested,上下文 我有一组JSON数据存储为一个对象。我想按特定属性“分组”此数据。这很有效。但是,我更希望能够对已经分组的数据进行进一步分组。这就是我被卡住的地方。我所遵循的过程可能是完全错误的,因此,如果您有更好的方法来分组,并进一步分组JSON数据,请说 过程 获取数据对象,并将其替换为包含组级别、过滤器和新的数据对象的新对象,依此类推,直到完成所有分组 问题 如何遍历此结构,特别针对最低的数据对象,创建如下的新分组(我可以这样做),然后将整个批次作为全新的结构返回,以用于代码的其余部分。问题在于保

上下文

我有一组JSON数据存储为一个对象。我想按特定属性“分组”此数据。这很有效。但是,我更希望能够对已经分组的数据进行进一步分组。这就是我被卡住的地方。我所遵循的过程可能是完全错误的,因此,如果您有更好的方法来分组,并进一步分组JSON数据,请说

过程

获取
数据
对象,并将其替换为包含
组级别
过滤器
和新的
数据
对象的新对象,依此类推,直到完成所有分组

问题

如何遍历此结构,特别针对最低的
数据
对象,创建如下的新分组(我可以这样做),然后将整个批次作为全新的结构返回,以用于代码的其余部分。问题在于保持结构完整,同时能够在最低级别进行更改

原始数据结构:

Object:
- attr1:"val1"
- attr2:"val2"
- attr3:"val3"
- attr{n}:"val{n}"
Object:
- groupLevel:1
- filter:"attr2"
- data:Object:
  - "val2a": Array[18]
    - 0: Object
      - attr1:"val1"
      - attr2:"val2"
      - attr3:"val3"
      - attr4:"val4"
      - attr{n}:"val{y}"
    - 1: Object
    - 2: Object
    - 3: Object
    - {n}: Object
  - "val2b": Array[15]
  - "val2c": Array[6]
  - "val2d": Array[3]
  - "val2e": Array[2]
分组数据结构:

Object:
- attr1:"val1"
- attr2:"val2"
- attr3:"val3"
- attr{n}:"val{n}"
Object:
- groupLevel:1
- filter:"attr2"
- data:Object:
  - "val2a": Array[18]
    - 0: Object
      - attr1:"val1"
      - attr2:"val2"
      - attr3:"val3"
      - attr4:"val4"
      - attr{n}:"val{y}"
    - 1: Object
    - 2: Object
    - 3: Object
    - {n}: Object
  - "val2b": Array[15]
  - "val2c": Array[6]
  - "val2d": Array[3]
  - "val2e": Array[2]
分组数据结构(我猜,因为我不知道如何进入这个阶段,所以这个问题):

我可以将1个级别分组,但现在我正在尝试将一个分组的数据集分组,然后我意识到,如下图所示,每次向下钻取时,我都会“丢弃”较高的级别,因此,虽然我得到了最低的
数据
对象,但在我用另一个分组级别替换最终的“数据”对象后,我丢失了上面的所有级别。但是如何保持整个结构并创建新的分组

当前无法向下钻取此新结构的代码段:

Object:
- attr1:"val1"
- attr2:"val2"
- attr3:"val3"
- attr{n}:"val{n}"
Object:
- groupLevel:1
- filter:"attr2"
- data:Object:
  - "val2a": Array[18]
    - 0: Object
      - attr1:"val1"
      - attr2:"val2"
      - attr3:"val3"
      - attr4:"val4"
      - attr{n}:"val{y}"
    - 1: Object
    - 2: Object
    - 3: Object
    - {n}: Object
  - "val2b": Array[15]
  - "val2c": Array[6]
  - "val2d": Array[3]
  - "val2e": Array[2]
if(baseObject['groupLevel']){
while(baseObject['groupLevel']!=1){
baseObject['groupLevel']++;
baseObject=baseObject['data'];
}
//一旦退出循环,我“应该”剩下一个baseObject,我可以进一步分组。
}否则{
//没有分组的baseObject,将数据分组,并将其存储在上面所示的结构中,使其级别为1。
}

根据用户对不完整结构示例的反馈更新问题。顺便说一句,我可能完全错了。如果有人能提出更好的JSON数据分组方法,请回答。

回答我自己的问题,但仍然欢迎其他人提供输入。这不一定是“正确答案”,但它提供了一条继续下去的道路

从评论中我发现我上面的逻辑没有意义,老实说,我正在努力找出它是否能正常工作

下划线.js
因此,我能找到的最佳解决方案是使用类似的工具及其功能,以实现相同的结果,而无需重新发明轮子


想法?

我猜您希望提供一些方法来浏览/过滤大量对象。在这种情况下,考虑将分组与过滤相结合,最好是服务器端。 如果数据集的大小适中,那么您的方法可能会运行良好。我已经创建了,如果您检查控制台窗口中转储的对象,它们看起来与您的结构相似。其思想是使用
GroupedData
类来代替对象数组。构造函数获取原始数据并构建
属性,保留原始数据不变

function GroupedData(data, prop) {
    var self = this;
    self.groups = {};
    self.filter = prop;
    data.forEach(function(o, i) {
        var pval = o[prop];
        if(!self.groups.hasOwnProperty(pval)) {
            self.groups[pval] = [];
        }
        self.groups[pval].push(o);
    });
}
GroupedData.prototype.thenBy = function(prop) {
    var self = this;
    function processTree(branch) {
        branch = branch || self;
        for(var parentProp in branch.groups) {
            if(branch.groups.hasOwnProperty(parentProp) ) {
                var pg = branch.groups[parentProp];
                if(pg instanceof GroupedData) {
                    processTree(pg);
                } else {
                    var sub = new GroupedData(pg, prop);
                    branch.groups[parentProp] = sub;
                }
            }
        }
    }
    processTree();
    return this;
}
此代码不跟踪液位,但很容易记录


显然,您必须构建用于分组的UI。用户应用分组后,立即创建新的GroupedData实例(第一级)或仅应用
。然后使用()
。当显示对象列表时,您应该检查它是否是GroupedData的实例,并呈现适当的UI。

您编写分组数据结构的方式似乎没有为其分配任何筛选属性?我误解了吗?在JSON中会是这样的吗?啊,是的,我犯了一个错误。结构中也应该有过滤器级别,我现在修改这个问题。谢谢。我恐怕不能完全理解您最初的
数据
对象和分组的
数据
对象之间的关系。如何知道初始对象的哪些属性进入哪个分组对象?你的逻辑是什么?逻辑只是猜测,我不知道最好的方法,所以我尝试了一些事情。通过进一步的研究,我发现我最好使用下划线.js进行分组,而不是重新发明轮子。但我仍然需要找出如何以最佳方式迭代以在页面上输出数据。这一部分可能必须是一个新的问题,因此,为了避免离题。Russell,您还没有解释如何从
原始数据结构
分组数据结构
。如果很难用文字来解释,那么就用实际数据来举例(
valn
不精确:它是一个值还是一个对象?):给出几个输入,以及第一组的相应预期输出。现在,我们看到一个
过滤器
属性,但是我们不知道您想要做什么样的过滤。筛选器正在拒绝/接受与布尔谓词相关的值。那个谓词是什么?如果第一步是明确的,那么递归步骤应该自然进行。我可以理解它的不明确之处,因为我看得越多,我给出的示例结构就越有漏洞。这就是问题所在,这只是一个概念的证明,我不知道它应该是什么样子。所以这个问题。用最简单的术语来说,我有JSON数据,我需要按列1分组,然后再按列2分组,如果需要,还可以进一步分组。问题是如何做到这一点,以及如何将其存储在对象或数组中,并且仍然能够保持良好的数据结构自从找到underline.js和nrodic给出的另一个答案以来,我觉得不需要返回并尝试修复数据结构,就可以继续进行下去