簡體   English   中英

如何使用JavaScript排序對樹JSON對象進行雙重排序?

[英]How to double-sort a tree JSON object using JavaScript sort?

我需要param1排序z對象,然后按param2排序。 我的嘗試返回重復的對象實例,其中對象參數為整數且非唯一。

我該如何解決這個問題?

z=[{object1},{object2},{object3},...,{objectN}];
z.sort(function(x,y){
    if(x.param1-y.param1>0){return -1};
    if(x.param1-y.param1<0){return 1};
    if(x.param1-y.param1==0){
        if(x.param2-y.param2>0){return -1};
        if(x.param2-y.param2<0){return 1};
    }; 

});

z類似於:

z=[{"level":0,"order":0,"t":"section","a":{"class":"ro s-14 m-3"}},
    {"level":1,"order":0,"t":"h1","a":{"class":"tx-1 s-35"},"x":"This is a text"},
    {"level":1,"order":1,"t":"div","a":{"class":"tx-0 m-3"}},
        {"level":2,"order":0,"t":"h2","a":{"class":"tx-0 s-18"},"x":"This is a text"},
        {"level":2,"order":1,"t":"h3","a":{"class":"tx-0 s-14 fw-3"}},
            {"level":3,"order":0,"t":"li","x":"This is a text"},
            {"level":3,"order":1,"t":"li","x":"This is a text"},
            {"level":3,"order":2,"t":"li","x":"This is a text"},
            {"level":3,"order":3,"t":"li","x":"This is a text"},
            {"level":3,"order":4,"t":"li","x":"This is a text"},
            {"level":3,"order":5,"t":"li","x":"This is a text"},
            {"level":3,"order":6,"t":"li","x":"This is a text"},
            {"level":3,"order":7,"t":"li","x":"This is a text"},
            {"level":3,"order":8,"t":"li","x":"This is a text"},
        {"level":2,"order":2,"t":"h4","x":"This is a text"},
    {"level":1,"order":2,"t":"div","a":{"class":"tx-0 m-3"}},
        {"level":2,"order":0,"t":"h2","x":"This is a text"},
        {"level":2,"order":1,"t":"h3","a":{"class":"tx-0 s-12 fw-3"}},
            {"level":3,"order":0,"t":"li","x":"This is a text"},
            {"level":3,"order":1,"t":"li","x":"This is a text"},
            {"level":3,"order":2,"t":"li","x":"This is a text"},
            {"level":3,"order":3,"t":"li","x":"This is a text"},
            {"level":3,"order":4,"t":"li","x":"This is a text"},
            {"level":3,"order":5,"t":"li","x":"This is a text"},
            {"level":3,"order":6,"t":"li","x":"This is a text"},
            {"level":3,"order":7,"t":"li","x":"This is a text"},
            {"level":3,"order":8,"t":"li","x":"This is a text"},
            {"level":3,"order":9,"t":"li","x":"This is a text"},
            {"level":3,"order":10,"t":"li","x":"This is a text"},
            {"level":3,"order":11,"t":"li","x":"This is a text"},
        {"level":2,"order":2,"t":"h4","x":"This is a text"},
];

您的實現問題是對於param1param2 ,如果返回值不正確,則您執行相同的操作。 您的更正將是:

z = [ { object1 }, { object2 }, { object3 },...,{ objectN }];
z.sort(function(x,y){
    if(x.param1-y.param1>0){return -1};
    if(x.param1-y.param1<0){return 1};
    if(x.param1-y.param1==0){
        if(x.param2-y.param2>0){return -1};
        if(x.param2-y.param2<0){return 1};
    }; 

});

順便說一句,我比您更喜歡這個:

 var items = [{ p1: 10, p2: 3 }, { p1: 9, p2: 4 }, { p1: 9, p2: 3 }, { p1: 10, p2: 2 }, { p1: 11, p2: 3 }, ]; items.sort((a, b) => (a.p1 - b.p1) || (a.p2 - b.p2)); console.log(items); 

如您所見,值的差異對排序函數很有意義,該函數允許您傳遞減法結果以用於排序。 如果difference為0(也意味着是false),那么它將用於第二個參數並返回其減法結果。

您可以對升序使用更緊湊的回調:

z.sort(function (x, y) {
    return x.param1 - y.param1 || x.param2 - y.param2;
});

或降序:

z.sort(function (x, y) {
    return y.param1 - x.param1 || y.param2 - x.param2;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM