繁体   English   中英

使用Javascript(Node.js)中的分层组对多维对象进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM