簡體   English   中英

帶有多個值的JavaScript array.sort(字符串和數字)

[英]JavaScript array.sort with multiple values (strings and numbers)

我想按主語 (字符串,字母)排序數組,然后是level (int,ascending) ,然后是name (字符串,字母) 我在SO上發現了許多其他線程,但我沒有找到任何多種變量類型 我以為我有它,但它沒有正確排序。

排序功能:

scipads.sort(function (a, b) {
    if (a.subject != b.subject)
        return a.subject < b.subject;
    if (a.level != b.level)
        return a.level - b.level;
    return a.name < b.name;
});

數組:

var scipads = [{
        "name": "L2 Physics Externals",
        "level": 2,
        "subject": "physics",
    }, {
        "name": "L2 Physics Internals",
        "level": 2,
        "subject": "physics",
    }, {
        "name": "L2 Chem Externals",
        "level": 2,
        "subject": "chemistry",
    }, {
        "name": "L2 Chem Internals",
        "level": 2,
        "subject": "chemistry",
    }, {
        "name": "L2 Bio Internals",
        "level": 2,
        "subject": "biology",
    }, {
        "name": "L2 Bio Externals",
        "level": 2,
        "subject": "biology",
    }, {
        "name": "L1 Electricity & Magnetism",
        "level": 1,
        "subject": "physics",
    }, {
        "name": "L1 Wave Behaviour",
        "level": 1,
        "subject": "physics",
    }, {
        "name": "L1 Heat",
        "level": 1,
        "subject": "physics",
    }, {
        "name": "L1 Carbon Chemistry",
        "level": 1,
        "subject": "chemistry",
    }, {
        "name": "L1 Selected Elements",
        "level": 1,
        "subject": "chemistry",
    }, {
        "name": "L1 Chemical Reactions",
        "level": 1,
        "subject": "chemistry",
    },
];

我如何按主題排序,然后是水平,然后命名?

比較應該返回一個整數 這是一個例子:

scipads.sort((a, b) => {
    if (a.subject != b.subject) { 
        return a.subject < b.subject ? -1 : 1; 
    }
    if (a.level != b.level) { 
        return a.level - b.level; 
    }
    return a.name < b.name ? -1 : 1;
})

您的排序比較功能已接近,但尚未完全開啟。 你應該返回-1表示小於0,0表示相等,1表示大於。 請參閱此處獲取文檔

示例:更改return a.subject < b.subjectreturn a.subject < b.subject ? -1 : 1; return a.subject < b.subject ? -1 : 1;

使用localeCompare比較字符串

 var scipads=[{name:"L2 Physics Externals",level:2,subject:"physics"},{name:"L2 Physics Internals",level:2,subject:"physics"},{name:"L2 Chem Externals",level:2,subject:"chemistry"},{name:"L2 Chem Internals",level:2,subject:"chemistry"},{name:"L2 Bio Internals",level:2,subject:"biology"},{name:"L2 Bio Externals",level:2,subject:"biology"},{name:"L1 Electricity & Magnetism",level:1,subject:"physics"},{name:"L1 Wave Behaviour",level:1,subject:"physics"},{name:"L1 Heat",level:1,subject:"physics"},{name:"L1 Carbon Chemistry",level:1,subject:"chemistry"},{name:"L1 Selected Elements",level:1,subject:"chemistry"},{name:"L1 Chemical Reactions",level:1,subject:"chemistry"}]; scipads.sort(function(a, b) { if (a.subject != b.subject) return a.subject.localeCompare(b.subject); else if (a.level != b.level) return a.level - b.level; return a.name.localeCompare(b.name); }); console.log(scipads); 

我的解決方案,首先比較主題,然后比較水平

 var scipads=[{name:"L2 Physics Externals",level:2,subject:"physics"},{name:"L2 Physics Internals",level:2,subject:"physics"},{name:"L2 Chem Externals",level:2,subject:"chemistry"},{name:"L2 Chem Internals",level:2,subject:"chemistry"},{name:"L2 Bio Internals",level:2,subject:"biology"},{name:"L2 Bio Externals",level:2,subject:"biology"},{name:"L1 Electricity & Magnetism",level:1,subject:"physics"},{name:"L1 Wave Behaviour",level:1,subject:"physics"},{name:"L1 Heat",level:1,subject:"physics"},{name:"L1 Carbon Chemistry",level:1,subject:"chemistry"},{name:"L1 Selected Elements",level:1,subject:"chemistry"},{name:"L1 Chemical Reactions",level:1,subject:"chemistry"}]; // sort by subject, then level, then name var res = scipads.sort((a, b) => { if (a.subject > b.subject) { return 1; } else if (a.subject < b.subject) { return -1; } else if ( a.level > b.level){ return 1; } else if (a.level < b.level) { return -1; } else if (a.name > b.name) { return 1; } else if (a.name < b.name) { return -1; } return 0; }); console.log(res) 

要比較字符串,您應該使用string.localeCompare 此外,您可以嘗試創建一個具有優先級列表的數組,並在其上循環進行排序。

 var scipads=[{name:"L2 Physics Externals",level:2,subject:"physics"},{name:"L2 Physics Internals",level:2,subject:"physics"},{name:"L2 Chem Externals",level:2,subject:"chemistry"},{name:"L2 Chem Internals",level:2,subject:"chemistry"},{name:"L2 Bio Internals",level:2,subject:"biology"},{name:"L2 Bio Externals",level:2,subject:"biology"},{name:"L1 Electricity & Magnetism",level:1,subject:"physics"},{name:"L1 Wave Behaviour",level:1,subject:"physics"},{name:"L1 Heat",level:1,subject:"physics"},{name:"L1 Carbon Chemistry",level:1,subject:"chemistry"},{name:"L1 Selected Elements",level:1,subject:"chemistry"},{name:"L1 Chemical Reactions",level:1,subject:"chemistry"}]; var priority = ["subject", "level", "name"] scipads.sort(function(a,b){ var val = 0; priority.some(function(k){ val = compare(a,b,k); return val !== 0; }); }) function compare(a,b,k){ switch(typeof a[k]){ case "string": return a[k].localeCompare(b[k]); case "number": return a[k] - b[k] } } console.log(scipads) 

暫無
暫無

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

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