Javascript JS动态对象内对象内对象内对象。。。穿越
上下文 我有一组JSON数据存储为一个对象。我想按特定属性“分组”此数据。这很有效。但是,我更希望能够对已经分组的数据进行进一步分组。这就是我被卡住的地方。我所遵循的过程可能是完全错误的,因此,如果您有更好的方法来分组,并进一步分组JSON数据,请说 过程 获取Javascript JS动态对象内对象内对象内对象。。。穿越,javascript,jquery,javascript-objects,nested,Javascript,Jquery,Javascript Objects,Nested,上下文 我有一组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给出的另一个答案以来,我觉得不需要返回并尝试修复数据结构,就可以继续进行下去