使用Javascript中的分层组sorting多维对象(Node.js)

我有一个分层的对象,我通过在父母身边走过,对孩子进行sorting来分类孩子。 这工作。 但现在,我需要select打破层次结构,并创build新的虚拟限制。

为了说明这一点,我们举一个有x个 Wifes的人的例子。 与每个妻子,他有孩子。 我可以根据每个妻子或每个人的妻子来分类孩子。

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 

并考虑在他们的父母内按字母顺序sorting:

 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 

这是一个非常简单的虚构对象。 实际上,我没有按字母sorting,而是对许多属性进行多列sorting。

将结果输出到表格是可以的,但是处理本身已经花费了大量的时间和内存。 我不想让这个更复杂。

如果没有问题的话,我只是将对象平铺为一个数组中的表格,将每个多列types链接成一个超级多列types,然后从最接近的共同祖先开始重新组合,从而保留原有的循环。

但是我试图以更高效的方式解决这个问题,而不需要将对象转换为一个完整的表格数组。

  • 我怎么扯这个? 实际上循环了他们每一个两次?
    • 也许这种sorting的“知名”解决scheme我还不知道?
    • 也许有巫术可用,为所有“虚拟”父母使用引用来创build类似于表的logging,然后将这些引用归入层次结构中,而不会循环遍历它们?

下面是我所指的对象types的一个例子:By Object ,我的意思是,尽pipe对象包含对象的数组[] ,当它有多个成员时。

 { "men" : [ { "name" : "Murphy", // a lot of properties "wifes" : [ { "name" : "Winnie", // a lot of properties "kids" : [ { "name" : "Kurt", // a lot of properties }, {}, {} // etc... ] }, {}, {} // etc... ] }, {}, {} // etc... ] } 

请注意,在这种情况下,我的例子是错误的,因为男人,妻子和孩子都是人类。 但实际上有不同的对象具有不同的性质。 假设存在多个宇宙,我应该select宇宙,地球,土壤或其他东西。 ;)

我们希望能够把属于一个男人的孩子分类

那么我会安排他们这样的:

 Marley Karla Wilma Kasper Wonda Kevin Wilma Kyra Wonda Murphy Kara Winnie Klaus Wendy Klea Wendy Kurt Winnie 

当然,因为每个孩子只有一个母亲,所以没有太大的差别,但是对于您的实际数据,这可能是不同的。

然而,现在你已经可以看到,你只需要对每个人的每个kids进行sorting。

所以,一般来说,不要将它们拼成一个大表格数组,多列sorting,而是按照您的build议对结果进行重组,您应该首先进行分组,然后对组进行sorting – 有点像桶sorting 。

 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