[英]Sorting a multi-dimensional object with hierarchical groups in Javascript (Node.js)
我有一个层次结构的对象,可以通过在父级上对孩子进行排序并对孩子进行排序。 这可行。 但是现在,我需要选择打破层次结构并创建新的虚拟约束。
为了说明这一点,让我们以一个有x个妻子的男人为例。 他和每个妻子都有y个孩子。 我可以按妻子对孩子分类,也可以按男人对妻子分类。
Man01 Wife01a Kid01aA
Kid01aB
Wife01b Kid01bC
Kid01bD
Man02 Wife02c Kid02cE
Kid02cF
Wife02d Kid02dG
Kid02dH
让我们给他们起个名字:
Murphy Winnie Kurt
Kara
Wendy Klaus
Klea
Marley Wonda Kasper
Kyra
Wilma Kevin
Karla
然后考虑按字母顺序在父母中对它们进行排序:
Marley Wilma Karla
Kevin
Wonda Kasper
Kyra
Murphy Wendy Klaus
Klea
Winnie Kara
Kurt
但是现在,我们希望能够对属于男人,妻子或一般孩子的孩子进行分类?
Marley Wilma Karla
Wonda Kasper
Wilma Kevin
Wonda Kyra
Murphy Winnie Kara
Wendy Klaus
Wendy Klea
Winnie Kurt
这是一个极大简化的虚构对象。 实际上,我对许多属性进行了多列排序,而不是按字母顺序排序。
将结果输出到表中可以,但是处理本身已经花费了很多时间和内存。 我不想进一步复杂化。
如果那没问题,我只需将对象展平为数组中的表,将每个多列排序链接到一个超级多列排序,然后从保持完整的最接近的祖先开始重新组合,该祖先保留完整的循环。
但是我试图以一种更有效的方式解决此问题,而无需将对象转换为成熟的表数组。
这是我要引用的对象类型的一个示例:用Object
表示,实际上是{}
,尽管对象包含多个成员时包含对象{}
数组[]
。
{
"men" : [
{
"name" : "Murphy",
// a lot of properties
"wifes" : [
{
"name" : "Winnie",
// a lot of properties
"kids" : [
{
"name" : "Kurt",
// a lot of properties
}, {}, {} // etc...
]
}, {}, {} // etc...
]
}, {}, {} // etc...
]
}
请注意,在这种情况下,我的示例是错误的,因为男人,妻子和孩子都是人类。 但实际上,存在具有不同属性的不同对象。 假设有多个宇宙,我应该选择宇宙,行星,土壤或其他东西。 ;)
我们希望能够对属于男人的孩子进行分类
然后我会像这样安排他们:
Marley Karla Wilma
Kasper Wonda
Kevin Wilma
Kyra Wonda
Murphy Kara Winnie
Klaus Wendy
Klea Wendy
Kurt Winnie
当然,由于每个孩子只有一位母亲,所以差异不大,但是对于您的实际数据来说可能有所不同。
但是,您现在已经可以看到,您只需要对每个人的每个kids
数组进行排序。
因此,通常,不要扁平化为一个大表数组,而是对其进行多列排序,然后按照您的建议将结果重新分组,您应该先进行分组,然后再对组进行排序-有点像存储桶排序 。
var men = data["men"];
men.forEach(function (man) {
var kids = {};
var wifes = man["wifes"];
for (var i=0; i<wifes.length; i++) {
var wkids = wifes[i]["kids"];
for (j=0; j<wkids.length; j++) {
var id = wkids[j]["name"];
if (id in kids) {
kids[id].mothers.push(wifes[i]);
else {
kids[id] = wkids[i];
kids[id].mothers = [ wifes[i] ];
}
}
}
// if the id is the sort criteria:
man["kids"] = Object.keys(kids).sort().map(function(id) {
return kids[id];
});
// else build the array first and then sort it:
// man["kids"] = Object.values(kids).sort(function(kida, kidb) {
// <some kid comparison>
// });
// you might integrate this loop in the above, but it's independent:
man["kids"].forEach(function(kid) {
kid["mothers"].sort( /* some mother comparison */ );
})
});
// now every man has a sorted "kids" array with each kid having a sorted "mothers" array
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.