簡體   English   中英

按特定順序對對象數組進行排序

[英]Sorting an array of objects in a specific order

我有以下數組:

        [{"cod_nivel":"INC2","cod_modelo":"D"},   
        {"cod_nivel":"PRIM1","cod_modelo":"B"},   
        {"cod_nivel":"INC2","cod_modelo":"B"},  
        {"cod_nivel":"INC1","cod_modelo":"D"},
        {"cod_nivel":"PRIM1","cod_modelo":"D"},
        {"cod_nivel":"BAC2","cod_modelo":"B"},    
        {"cod_nivel":"BAC2","cod_modelo":"D"},    
        {"cod_nivel":"BAC2","cod_modelo":"A"}]

我需要通過“cod_modelo”升序按“cod_nivel”分組來對這個對象數組進行排序。 所以結果應該是:

    [{"cod_nivel":"INC1","cod_modelo":"D"},    
    {"cod_nivel":"INC2","cod_modelo":"B"},
    {"cod_nivel":"INC2","cod_modelo":"D"},    
    {"cod_nivel":"PRIM1","cod_modelo":"B"},    
    {"cod_nivel":"PRIM1","cod_modelo":"D"},
    {"cod_nivel":"BAC2","cod_modelo":"A"},    
    {"cod_nivel":"BAC2","cod_modelo":"B"},    
    {"cod_nivel":"BAC2","cod_modelo":"D"}]

好吧,我制作了這個代碼,首先通過cod_nivel然后通過cod_modelo對數組進行排序:

var sortedArray = array.sort(function (a, b) {
    return (a["cod_nivel"] > b["cod_nivel"]) ? 1 : -1;
}).sort(function (a, b) {
    if (a["cod_nivel"] == b["cod_nivel"])
        return (a["cod_modelo"] > b["cod_modelo"]) ? 1 : -1;
    else
        return 0;
});

問題是這個代碼也通過“cod_nivel”排序,所以獲得的數組將是:

    [{"cod_nivel":"BAC2","cod_modelo":"A"},    
    {"cod_nivel":"BAC2","cod_modelo":"B"},    
    {"cod_nivel":"BAC2","cod_modelo":"D"},
    {"cod_nivel":"INC1","cod_modelo":"D"},    
    {"cod_nivel":"INC2","cod_modelo":"B"},
    {"cod_nivel":"INC2","cod_modelo":"D"},    
    {"cod_nivel":"PRIM1","cod_modelo":"B"},    
    {"cod_nivel":"PRIM1","cod_modelo":"D"}]

請注意,BAC2 cod_nivel對象位於開頭。

我需要的是首先通過cod_nivel訂購,但按給定順序排序,即:

  1. INC1
  2. INC2
  3. PRIM1
  4. PRIM2
  5. BAC1
  6. BAC2

我假設我需要一個固定順序為“cod_nivel”的數組並在ordring時使用它,但我不知道如何使用它所以我沒有包含在我的方法中。

var order_arr = ['INC1', 'INC2', 'PRIM1', 'PRIM2', 'BAC1', 'BAC2']

之后,然后按cod_modelo排序(按每個cod_nivel分組)。

我希望我已經清楚地解釋了自己,有人可以幫助我。

您可以在關聯數組中分配索引,如下所示

var cod_nivel_order = {
    'INC1': 0,
    'INC2': 1,
    'PRIM1': 2,
    'PRIM2': 3,
    'BAC1': 4,
    'BAC2': 5
};

然后你可以這樣排序

function compare(a, b) {
    if (a === b) {
        return 0;
    }
    return a < b ? -1 : 1;
}

var sortedArray = array.sort(function (a, b) {

    // First compare corresponding values of `cod_nivel` from `cod_nivel_order`
    var index_result = compare(cod_nivel_order[a.cod_nivel],
        cod_nivel_order[b.cod_nivel]);

    // If they are equal
    if (index_result === 0) {

        // Return the result of comparing `cod_modelo`s
        return compare(a.cod_modelo, b.cod_modelo);
    }

    return index_result;
});

現在結果將是

[ { cod_nivel: 'INC1', cod_modelo: 'D' },
  { cod_nivel: 'INC2', cod_modelo: 'B' },
  { cod_nivel: 'INC2', cod_modelo: 'D' },
  { cod_nivel: 'PRIM1', cod_modelo: 'B' },
  { cod_nivel: 'PRIM1', cod_modelo: 'D' },
  { cod_nivel: 'BAC2', cod_modelo: 'A' },
  { cod_nivel: 'BAC2', cod_modelo: 'B' },
  { cod_nivel: 'BAC2', cod_modelo: 'D' } ]
var data = [{
    "cod_nivel": "INC2",
    "cod_modelo": "B"
}, {
    "cod_nivel": "INC2",
    "cod_modelo": "D"
}, {
    "cod_nivel": "INC2",
    "cod_modelo": "B"
}, {
    "cod_nivel": "PRIM1",
    "cod_modelo": "B"
}, {
    "cod_nivel": "INC2",
    "cod_modelo": "B"
}, {
    "cod_nivel": "INC1",
    "cod_modelo": "D"
}, {
    "cod_nivel": "INC2",
    "cod_modelo": "B"
}, {
    "cod_nivel": "PRIM2",
    "cod_modelo": "D"
}, {
    "cod_nivel": "BAC2",
    "cod_modelo": "B"
}, {
    "cod_nivel": "BAC2",
    "cod_modelo": "D"
}, {
    "cod_nivel": "BAC2",
    "cod_modelo": "A"
}];
var sortOrder = ['INC1', 'INC2', 'PRIM1', 'PRIM2', 'BAC1', 'BAC2'];
data.sort(function (a, b) {
    // first have a look at cod_nivel
    // get the indices of the given sortOrder
    // take the difference of the indices
    var delta = sortOrder.indexOf(a.cod_nivel) - sortOrder.indexOf(b.cod_nivel);
    // test, if the indices are the same
    if (delta === 0) {
        // the comparison should usually return 0,
        // but this will here not work. we need
        // the comparison of the second sort order of cod_modelo.
        // take the variables and make a real comparison,
        // while we expecting strings to be compared
        return a.cod_modelo === b.cod_modelo ? 0 : (a.cod_modelo < b.cod_modelo ? -1 : 1);
    }
    // otherwise return the delta
    return delta;
});

正如前面提到的那樣,以前的版本計算得不是很好。 所以這里是數字/數字或字符串/字符串比較的類型安全版本。

暫無
暫無

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

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