2013-02-06 26 views
2

我有一个层次结构对象,我通过父母走过并对孩子进行排序来对孩子进行排序。这工作。但现在,我需要选择打破层次并创建新的虚拟限制。使用Javascript中的层次结构组排列多维对象(Node.js)

为了说明这一点,我们举一个男人的例子,他有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 

而且想想字母中父母对它们进行排序:

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... 
    ] 
} 

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

+0

+1为漂亮的名字。但是,您能否告诉我们更多关于您的数据结构的信息,例如一个JSON-ish示例对象?你真的需要做这种类型的客户端与JS,为什么你不使用你最喜欢的 DMS DBS? – Bergi

+0

这是服务器端JavaScript使用节点。这是'DMS'。会有很多排序操作,这并不是说我可以在某个程序中执行一次操作,并完成它。 :) – Redsandro

+0

什么是你的数据结构,它是如何存储的?你使用某种数据库(这是我以前拼错的“DBS”的意思)? – Bergi

回答

0
我们希望能够到属于一个人

然后孩子们进行排序

我会安排他们这样的:

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

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

然而,你已经可以看到现在,你只需要梳理各每人的kids阵列。因此,一般来说,不是将数据展平成一个大表格阵列,而是多列排序,然后根据您的建议对结果进行重新组合,您应该首先进行分组,然后对这些组进行排序 - 有点像bucket sort

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